【问题标题】:Rails Polymorphic AssociationRails 多态关联
【发布时间】:2011-05-18 13:41:36
【问题描述】:

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

一个用户需要属于一个组,但一个组可以拥有_many 个用户和拥有_many 个组。我需要我的团队像一棵树,我认为 Ancestry gem 应该会有所帮助,但我还没有尝试过。

似乎我需要某种加入模型,即会员资格,它有一个 user_id 和一个 group_id。然后我可以做一个 has_many :through 来将用户与组相关联,但是我怎样才能让它也有很多组呢? Membership 会是多态模型吗?

谢谢!

安迪

【问题讨论】:

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


    【解决方案1】:

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

    您正在谈论单表继承,其中组可以属于另一个组并具有其他组。像下面这样的东西就是你要找的东西。

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

    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
    

    【讨论】:

    • 作为 Rails 的新开发人员,我不会在外键方面跟随您。你能详细说明一下吗?或者提供一个链接,让我可以了解更多关于它们的信息?
    • 现在,'Ancestry' 宝石不是为你做这件事吗? github.com/stefankroes/ancestry
    • 是的,祖先宝石给你他们作为孩子和父母等
    • 所以我可能会创建一个会员加入模型来加入用户和组,然后在组上使用 Ancestry 以允许组成为我想的其他组的父/子。
    【解决方案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
    

    那么你的 User 和 Group 类就会有类似的东西

    has_many :memberships, :as => :member
    

    【讨论】:

    • ErsatzRyan 确实有一个正确的观点,即 Membership 与 Group 以及 属于 Group 具有多态关联是很奇怪的。但我仍然认为这是一个有效的多态用例。
    • 谢谢 bioneuralnet,看来我还有点要学,哈哈。我不确定我想采取哪种方法。我并没有真正遵循他处理外键的代码行,所以我会做一些研究。
    • 任何一种方法都应该有效。您希望显示、循环、编辑等数据的方式将决定哪种方式更适合。
    【解决方案3】:

    我认为祖先是正确的答案。我使用了一个更老的acts_as_tree,它很有帮助。现在开始一个新项目,我会使用 Ancestry。正如其他答案所建议的那样,您可以不这样做,但您不会获得 Ancestry 为您提供的所有免费方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2019-03-14
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多