Rails多态协会

时间:2011-05-18 13:41:36

标签: ruby-on-rails polymorphic-associations polymorphism model-associations

我很难掌握Rails中的多态关联。我有两个模型,Group和User。

用户需要属于某个群组,但群组可以拥有多个用户且拥有多个群组。我需要我的团队就像一棵树,我认为Ancestry宝石应该有所帮助,但我还没有尝试过。

似乎我需要某种具有user_id和group_id的连接模型Membership。然后我可以做一个has_many:通过将用户与群组联系起来,但我怎么能让它拥有多个群组呢?会员资格会是多态模型吗?

谢谢!

安迪

4 个答案:

答案 0 :(得分:4)

这不是多态关联。多态关联是一种超越类类型的关联,例如属于人类和狗类的图像类。

您正在讨论单表继承,其中组可以属于另一个组并具有其他组。以下是您正在寻找的东西。

这只是空中代码,可能需要一些调整

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

答案 1 :(得分: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

答案 2 :(得分:2)

检查此链接:Rails model relationships。我发现它非常有助于确定导轨支持的各种关系。

编辑:固定网址。遗憾。

答案 3 :(得分:2)

我认为祖先是正确的答案。我使用了一个更老的,acts_as_tree,它很有帮助。现在开始一个新项目我会使用Ancestry。你可以在没有其他答案的情况下做到这一点,但你不会得到Ancestry给你的所有免费方法。