模型可以属于 STI 儿童吗?
Can model belong to STI child?
我有一个基础 class Place
和多个子 class 使用 STI 约定。我有一个单独的模型 Post
,belongs_to
Place
的子 class 之一:
class Place < ApplicationRecord
end
class SubPlace < Place
has_many :posts, class_name: "SubPlace", foreign_key: "sub_place_id"
end
class Post < ApplicationRecord
belongs_to :sub_place, class_name: "SubPlace", foreign_key: "sub_place_id"
end
可以使用 Rails 控制台保存新的 Post
记录,但在尝试查找特定 SubPlace
的 Posts
时出现以下错误:
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column places.sub_place_id does not exist)
有什么办法可以做到这一点,或者我的联想必须只与基础 class 相关吗?
添加的架构:
create_table "posts", force: :cascade do |t|
t.string "title"
t.bigint "sub_place_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["sub_place_id"], name: "index_posts_on_sub_place_id"
end
create_table "places", force: :cascade do |t|
t.string "name"
t.string "type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column
places.sub_place_id does not exist)
您在 SubPlace
中的关联 无效 。您应该将其重写为
class SubPlace < Place
has_many :posts
end
处理关联和 STI 的更好方法是仅将关联设置为基础 class:
class Place < ApplicationRecord
end
class SubPlace < Place
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end
class AnotherKindOfPlace < Place
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end
class Post < ApplicationRecord
belongs_to :place
end
这让事情变得简单明了,因为 Post
不知道也不关心有不同种类的地方。当您访问 @post.place
时,ActiveRecord 会读取 places.type
列并将实例化正确的子类型。
如果基础 Post class 也有关联,您只需将其写为:
class Place < ApplicationRecord
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end
我有一个基础 class Place
和多个子 class 使用 STI 约定。我有一个单独的模型 Post
,belongs_to
Place
的子 class 之一:
class Place < ApplicationRecord
end
class SubPlace < Place
has_many :posts, class_name: "SubPlace", foreign_key: "sub_place_id"
end
class Post < ApplicationRecord
belongs_to :sub_place, class_name: "SubPlace", foreign_key: "sub_place_id"
end
可以使用 Rails 控制台保存新的 Post
记录,但在尝试查找特定 SubPlace
的 Posts
时出现以下错误:
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column places.sub_place_id does not exist)
有什么办法可以做到这一点,或者我的联想必须只与基础 class 相关吗?
添加的架构:
create_table "posts", force: :cascade do |t|
t.string "title"
t.bigint "sub_place_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["sub_place_id"], name: "index_posts_on_sub_place_id"
end
create_table "places", force: :cascade do |t|
t.string "name"
t.string "type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column places.sub_place_id does not exist)
您在 SubPlace
中的关联 无效 。您应该将其重写为
class SubPlace < Place
has_many :posts
end
处理关联和 STI 的更好方法是仅将关联设置为基础 class:
class Place < ApplicationRecord
end
class SubPlace < Place
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end
class AnotherKindOfPlace < Place
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end
class Post < ApplicationRecord
belongs_to :place
end
这让事情变得简单明了,因为 Post
不知道也不关心有不同种类的地方。当您访问 @post.place
时,ActiveRecord 会读取 places.type
列并将实例化正确的子类型。
如果基础 Post class 也有关联,您只需将其写为:
class Place < ApplicationRecord
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end