2

我在Rails中很難掌握多態關聯。我有兩個模型,組和用戶。Rails多態協會

用戶需要屬於一個組,但一個組可以擁有_many個用戶和have_many組。我需要我的團隊像一棵樹,我認爲祖先的寶石應該有所幫助,但我還沒有嘗試過。

好像我需要某種加入模型,Membership,擁有user_id和group_id。然後,我可以做一個has_many:通過將用戶與羣組關聯起來,但是如何讓它擁有多個羣組?會員資格是多態模型嗎?

謝謝!

Andy

回答

4

這不是多態關聯。多態關聯是超越類類型的關聯,例如屬於人類和狗類的圖像類。

您正在討論Single Table Inheritance,其中組可以屬於另一個組並具有其他組。類似下面的內容就是你要找的東西。

這僅僅是空氣的代碼,可能需要一些調整

class User 
    belongs_to :group 
end 

class Group 
    has_many :users 
    has_many :sub_groups, :class => "Group", :foreign_key => :parent_group_id 
    belongs_to :parent_group, :class => "Group", :foreign_key => :parent_group_id 
end 
+0

作爲一個有點新的Rails開發人員,我沒有關注外鍵的問題。你能詳細闡述一下嗎?或提供一個鏈接到我可以瞭解更多關於他們的地方? – ardavis 2011-05-18 14:21:46

+1

[http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html) – ErsatzRyan 2011-05-18 14:23:53

+0

現在,不是'祖先'寶石爲你做這個? https://github.com/stefankroes/ancestry – ardavis 2011-05-18 14:34:18

2

是的,你已經基本上得到了它。您的會員模式需要以下字段:

group_id 
member_id 
member_type 

group_id是「成員」所屬的組。 member_id是Person或Group的id,member_type是'Person'或'Group'。

會員將有以下的關聯:

class Member < ActiveRecord::Base 
    belongs_to :member, :polymorphic => true 
end 

然後,你的用戶和組班會碰到這樣的

has_many :memberships, :as => :member 
+1

ErsatzRyan確實有一個有效的觀點,會員與Group *以及*屬於Group有多態關聯是奇怪的。但我仍然認爲這是一個有效的多態用例。 – bioneuralnet 2011-05-18 14:19:14

+0

感謝bioneuralnet,看起來我還有點學習,哈哈。我不確定採取哪種方法。我並沒有真正遵循處理外鍵的代碼行,所以我會做一些研究。 – ardavis 2011-05-18 14:23:23

+0

這兩種方法都應該有效。您想要顯示,循環瀏覽,編輯等數據將決定哪個更適合。 – bioneuralnet 2011-05-18 14:33:47

2

我認爲Ancestry是正確的答案。我已經使用了一個更老的,acts_as_tree,這是有幫助的。現在開始一個新項目,我會使用Ancestry。你可以在沒有其他答案的情況下做到這一點,但你不會得到Ancestry給你的所有自由方法。