所有连接表都有表吗?

时间:2010-10-14 01:18:17

标签: ruby-on-rails ruby ruby-on-rails-3 join

例如我有一个评论模型,我有一个帖子模型,但评论可以评论其他评论。

所以看来我需要一个联接表我会叫commentables。要创建它,我真的需要创建一个带有post_id和comment_id的可注释表吗?

或者我可以在没有这样的情况下做这样的事情:

has_many            :comments,
                    :through => :commentables,
                    :source => :post

不确定什么是实现这一目标的最佳方法。我是个新手。

1 个答案:

答案 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将返回PostComment条记录。

第二个选项是让所有评论都属于特定帖子,但有自己的父子关系:

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

这样,您的评论将始终属于帖子,并且可能属于另一条评论。

如果您计划嵌套评论(至少超过一个级别),我会建议第二个选项。这将允许您在一个查询中获取特定帖子的所有注释(而不必为每个注释找到子项),并且您可以在呈现它们之前对应用程序中的注释进行排序。但无论哪种方式都可行。