我在Rails中很難掌握多態關聯。我有兩個模型,組和用戶。Rails多態協會
用戶需要屬於一個組,但一個組可以擁有_many個用戶和have_many組。我需要我的團隊像一棵樹,我認爲祖先的寶石應該有所幫助,但我還沒有嘗試過。
好像我需要某種加入模型,Membership,擁有user_id和group_id。然後,我可以做一個has_many:通過將用戶與羣組關聯起來,但是如何讓它擁有多個羣組?會員資格是多態模型嗎?
謝謝!
Andy
我在Rails中很難掌握多態關聯。我有兩個模型,組和用戶。Rails多態協會
用戶需要屬於一個組,但一個組可以擁有_many個用戶和have_many組。我需要我的團隊像一棵樹,我認爲祖先的寶石應該有所幫助,但我還沒有嘗試過。
好像我需要某種加入模型,Membership,擁有user_id和group_id。然後,我可以做一個has_many:通過將用戶與羣組關聯起來,但是如何讓它擁有多個羣組?會員資格是多態模型嗎?
謝謝!
Andy
這不是多態關聯。多態關聯是超越類類型的關聯,例如屬於人類和狗類的圖像類。
您正在討論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
是的,你已經基本上得到了它。您的會員模式需要以下字段:
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
ErsatzRyan確實有一個有效的觀點,會員與Group *以及*屬於Group有多態關聯是奇怪的。但我仍然認爲這是一個有效的多態用例。 – bioneuralnet 2011-05-18 14:19:14
感謝bioneuralnet,看起來我還有點學習,哈哈。我不確定採取哪種方法。我並沒有真正遵循處理外鍵的代碼行,所以我會做一些研究。 – ardavis 2011-05-18 14:23:23
這兩種方法都應該有效。您想要顯示,循環瀏覽,編輯等數據將決定哪個更適合。 – bioneuralnet 2011-05-18 14:33:47
檢查此鏈接了:Rails model relationships。我發現它非常有助於確定輕鬆支持的各種關係。
編輯:固定的URL。抱歉。
我認爲Ancestry是正確的答案。我已經使用了一個更老的,acts_as_tree,這是有幫助的。現在開始一個新項目,我會使用Ancestry。你可以在沒有其他答案的情況下做到這一點,但你不會得到Ancestry給你的所有自由方法。
作爲一個有點新的Rails開發人員,我沒有關注外鍵的問題。你能詳細闡述一下嗎?或提供一個鏈接到我可以瞭解更多關於他們的地方? – ardavis 2011-05-18 14:21:46
[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
現在,不是'祖先'寶石爲你做這個? https://github.com/stefankroes/ancestry – ardavis 2011-05-18 14:34:18