2012-06-17 200 views
0

我試圖設計在軌 模型協會是由以下3種類型:Rails的模型關聯

評論員,博客帖子和評論

- >它的「評論員」,而不是「用戶」是什麼意味着 他們不是創建博客帖子的用戶... 而是他們僅創建評論。

雖然評論員 和評論之間的基本關係是顯而易見的:

class Commentator < ActiveRecord::Base 
    has_many :comments 

class Comment < ActiveRecord::Base 
    belongs_to: comments 

我不知道如何與「博客帖子」這個...... - >我想轉到能問對於所有Blogposts 評論員已經離開以及特定博客帖子的所有評論員 。

由於這是一個多一對多的關係我 使用:

class Commentator < ActiveRecord::Base 
    has_many :comments 
    has_many :blogposts, :through => :comments 

class Blogpost < ActiveRecord::Base 
    "has_many :commentators, :through => :comments 

當評論員創建了一個博客帖子,我必須 寫評論 的commenentator_id和blogpost_id由撲進評論表的相應字段?

我認爲最好將Blogposts作爲 ,因爲關係可能是 當評論員創建評論時會自動構建。 (除了評論員不能創建評論 到不存在的博客帖子...) 但是,評論員評論不會是多對多的 關係,我不能使用「has_many ...通過「了。

什麼是關聯這3種模型的好方法?

回答

2

解決了上述問題,

class Commentator < ActiveRecord::Base 
    has_many :comments 
    has_many :blogposts, :through => :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :commentator 
    belongs_to :blogpost 
end 

class Blogpost < ActiveRecord::Base 
    has_many :comments 
    has_many :commentators, :through => :comments 
    belongs_to :user 

class User 
    has_many :blogposts 
end 

要添加到現有的博客文章評論(假設我們有一個blogcommentator變量)

blog.comments.create(:commentator => commentator, :comment => "foo bar") 

OR

commentator.comments.create(:blog => blog, :comment => "foo bar") 

注意

而不是使用兩個模型的用戶(即,用戶和評論者),我會使用一個模型並分配特權 來區分評論者和博客文章作者。

class User 
    has_many :blogs 
    has_many :comments 
    has_many :commented_blogs, :through => :comments, :source => :blog 
end 

class Blog 
    has_many :comments 
    belongs_to :user 
    has_many :commenters, :through => :comments, :source => :user 
end 

class Comment 
    belongs_to :user 
    belongs_to :blog 
end 
  • 創建博客條目:

    if current_user.has_role?(:blog_writer) 
        current_user.blogs.create(params[:blog]) 
    end 
    
  • 添加評論:

    current_user.comments.create(:blog => blog, :content => "foor bar") 
    

    OR

    blog.comments.create(:user => current_user, :content => "foor bar") 
    
+0

真棒幫助。謝謝... – JoeFrizz