2014-02-16 34 views
0

我想設計一個評論系統,允許用戶通過評論發佈在其他用戶的頁面上。Rails協會 - 用戶有很多用戶通過評論

用戶將在他的頁面上發表評論,該頁面由另一個稱爲「評論者」的用戶發佈。

1)以下代碼是否合法/功能/體面設計?

2)可以重新命名爲「評論者」的用戶,還是非重命名的「用戶」,或者用戶的所有關聯名稱是否總是被重新命名爲語義?

3)是否有更好的方法來實現這個設計意圖(例如不通過:)來做一個has_many?

class User < ActiveRecord::Base 
    has_many :comments 
    has_many :users,  through: :comments 
    has_many :commenters, through: :comments, class_name: 'User' 
end 

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :commenter, class_name: 'User' 
end 

注:

我想允許用戶對用戶的評論,同時也對其他型號(例如人物,名人)。所以我會認爲通過關聯需要在各種has_many中使用註釋表。

用戶已經通過評論許多評論 字符通過的意見有許多評論 名人有過評論

+1

請標記您發現的答案爲接受的更有幫助。 –

+0

我仍然期待看到與軌道的解決方案。我沒有時間去嘗試這個寶石或測試rails代碼。我有點不情願。現在標記爲 – ahnbizcad

回答

4

我相信你的設計不會像現在這樣工作 - 你正在通過has_many混合has_many。如果我是你,我會使用類似這樣的方法:

class User < ActiveRecord::Base 
    has_many :owned_comments, class_name: 'Comments', foreign_key: 'owner_id' 
    has_many :posted_comments, class_name: 'Comments', foreign_key: 'commenter_id' 
end 

class Comment < ActiveRecord::Base 
    belongs_to :owner, class_name: 'User' 
    belongs_to :commenter, class_name: 'User' 
end 
+0

我認爲這通常更好有「歸屬」模式包含擁有模型的關鍵字。 我確實希望將其他屬性添加到評論模型中,並使用評論模型作爲其單獨的實體,這就是爲什麼我選擇了has_many。 我也希望允許用戶評論其他表格,比如人物和名人,所以我希望能容納設計來擴展。 我會更新原來的問題來反映這一點。 – ahnbizcad

+0

我可以只刪除'has_many:comments',並保持其餘的has_many通過? – ahnbizcad

+1

技術上可以通過has_many來實現,對於我來說用戶的評論聽起來有點奇怪。但是你更好地理解你的應用程序將如何發展,這取決於你。如果您還想在其他模型中發表評論,您可以使用多態關聯,例如在評論類'belongs_to:target,polymorphic:true'中,目標將是角色,名人等。http://guides.rubyonrails.org/association_basics.html#polymorphic-associations –

1

許多評論都試了試acts_as_commentable寶石它給很多其他的選擇,以及像公共的,私人留言https://github.com/jackdempsey/acts_as_commentable

+0

是否有一個很好的地方,我可以看到功能,功能,缺點? – ahnbizcad

+0

即使你是谷歌,你也不會發現任何缺點,但它是非常流行的評論寶石,並將爲您提供最大的用途 –

+1

也act_as_comment使用模型的名稱,使您可以使用相同的評論模型根據你在評論表中使用多個模型,你只需要添加act_as_commetable在你想要使用它的模型中休息所有將被處理的寶石本身 –

1

我在mongoid和rails中實現了類似的功能。模型是用戶,友誼和請求。它就像用戶將好友請求發送給其他用戶一樣。

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    devise :invitable, :database_authenticatable, :registerable, :recoverable, 
    :rememberable, :trackable, :validatable, :confirmable 
    ... 
    has_many :requests_from, class_name: "Request", inverse_of: :requested_by 
    has_many :requests_to, class_name: "Request", inverse_of: :requested_to 
    has_many :friendships, inverse_of: :owner 

    def friends 
    #retrive all the friendships and collect users have sent me a request or being sent a request. 
    fs = Friendship.any_of({:friend_id.in => [self.id]}, {:owner_id.in => [self.id]}).where(state: 'accepted') 
    User.in(id: fs.collect{|i| [i.friend_id, i.owner_id]}.flatten - [self.id]) 
    end 
end#User 

class Friendship 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :state, type: String, default: 'pending' 
    field :pending, type: Boolean, default: true 

    belongs_to :owner, class_name: 'User' 
    belongs_to :friend, class_name: "User" 

    validates :state, inclusion: { in: ["pending", "accepted", "rejected"]} 
    ... 
end#Friendship 

class Request 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :state, type: String, default: 'pending' 

    belongs_to :requested_by, class_name: 'User', inverse_of: :requests_from 
    belongs_to :requested_to, class_name: 'User', inverse_of: :requests_to 

    validates :state, inclusion: { in: ["pending", "accepted", "rejected"]} 
    ... 
end#Request 

我希望這會有所幫助。