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给你的所有自由方法。