例如我有一个评论模型,我有一个帖子模型,但评论可以评论其他评论。
所以看来我需要一个联接表我会叫commentables
。要创建它,我真的需要创建一个带有post_id和comment_id的可注释表吗?
或者我可以在没有这样的情况下做这样的事情:
has_many :comments,
:through => :commentables,
:source => :post
不确定什么是实现这一目标的最佳方法。我是个新手。
答案 0 :(得分:5)
不,在这种情况下你不需要连接表。连接表用于has_and_belongs_to_many
关系,在这种情况下,您不需要其中一个(评论不能属于很多帖子,可以吗?)。
你有两种方法可以解决这个问题。第一个是创建多态关系:
class Post < ActiveRecord::Base
has_many :comments, :as => :parent
end
class Comment < ActiveRecord::Base
belongs_to :parent, :polymorphic => true
has_many :children, :class_name => 'Comment', :as => :parent # We need to point this relationship to the Comment model, otherwise Rails will look for a 'Child' model
end
这将允许评论 属于帖子或其他评论。 Comment.last.parent
将返回Post
或Comment
条记录。
第二个选项是让所有评论都属于特定帖子,但有自己的父子关系:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :parent, :class_name => 'Comment' # We need to point this relationship to the Comment model, otherwise Rails will look for a 'Parent' model
has_many :children, :class_name => 'Comment' # We need to point this relationship to the Comment model, otherwise Rails will look for a 'Child' model
end
这样,您的评论将始终属于帖子,并且可能属于另一条评论。
如果您计划嵌套评论(至少超过一个级别),我会建议第二个选项。这将允许您在一个查询中获取特定帖子的所有注释(而不必为每个注释找到子项),并且您可以在呈现它们之前对应用程序中的注释进行排序。但无论哪种方式都可行。