rails has_many 多单table 继承
rails has_many multiple single table inheritance
我有几个基本模型,Post
和 Comment
,post
有很多 comment
:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to: :post
end
我对这些模型中的每一个都有单一的 table 继承,child 类 没有自己的数据库 table。我在 posts
和 comments
table 中有 type
列。
class ChildPost < Post
has_many :child_comments, class_name: "Comment"
end
class ChildComment < Comment
belongs_to :child_post, class_name: "ChildPost"
end
现在,如果我创建其中一些 objects
child_comment = ChildComment.create
child_post = ChildPost.create
child_post.child_comments << child_comment
child_post.save
当我 child_post.child_comments
我得到:
PG::UndefinedColumn: ERROR: column comments.child_post_id does not exist
child_post_id
列不存在是正确的(它是 post_id
),但是我需要做什么来更正它?
在设计方面,我这样设置是因为 child_comment
和 comment
的数据相同,但它们的行为略有不同。我希望 ChildComment
仅覆盖 Comment
的某些方法。我希望 comment
和 child_comment
是可区分的数据库条目。
如果这里有更好的设计,我愿意接受。
您需要在 has_many
关联中同时指定 :class_name
和 :foreign_key
:
has_many :child_comments, class_name: "Comment", :foreign_key => "post_id"
:foreign_key
选项让您可以直接设置外键的名称。因此,如果您将其设置为 post_id
,那么它将起作用,因为 post_id
列存在于 comments
table.
中
我有几个基本模型,Post
和 Comment
,post
有很多 comment
:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to: :post
end
我对这些模型中的每一个都有单一的 table 继承,child 类 没有自己的数据库 table。我在 posts
和 comments
table 中有 type
列。
class ChildPost < Post
has_many :child_comments, class_name: "Comment"
end
class ChildComment < Comment
belongs_to :child_post, class_name: "ChildPost"
end
现在,如果我创建其中一些 objects
child_comment = ChildComment.create
child_post = ChildPost.create
child_post.child_comments << child_comment
child_post.save
当我 child_post.child_comments
我得到:
PG::UndefinedColumn: ERROR: column comments.child_post_id does not exist
child_post_id
列不存在是正确的(它是 post_id
),但是我需要做什么来更正它?
在设计方面,我这样设置是因为 child_comment
和 comment
的数据相同,但它们的行为略有不同。我希望 ChildComment
仅覆盖 Comment
的某些方法。我希望 comment
和 child_comment
是可区分的数据库条目。
如果这里有更好的设计,我愿意接受。
您需要在 has_many
关联中同时指定 :class_name
和 :foreign_key
:
has_many :child_comments, class_name: "Comment", :foreign_key => "post_id"
:foreign_key
选项让您可以直接设置外键的名称。因此,如果您将其设置为 post_id
,那么它将起作用,因为 post_id
列存在于 comments
table.