2010-10-14 109 views
3

例如我有一個評論模型,我有一個帖子模型,但評論可以評論其他評論。所有連接表都有表嗎?

所以看來我需要一個連接表,我會打電話給commentables。要創建這個,我真的需要創建一個帶有post_id和comment_id的可評論表嗎?

或者,我可以做這樣的事情沒有一個:

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

不是真的知道什麼是做到這一點的最好辦法。我是一個巨大的新手。

回答

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 

這樣一來,您的意見將永遠屬於一個帖子,還有可能屬於另一個評論。

如果你打算嵌套評論(至少多於一個級別),我會建議第二個選項。這將允許您在一個查詢中獲取特定帖子的所有評論(而不必爲每條評論查找子文件),並且可以在渲染它們之前對應用程序中的評論進行排序。但無論哪種方式應該工作。

+3

很棒的回答。 +1 – 2010-10-14 02:20:14

+0

哇!我無法爲此感謝你!非常感謝你 – Trip 2010-10-14 10:15:48

+0

不客氣。 :) – vonconrad 2010-10-15 02:08:46

相關問題