【问题标题】:Multiple associations with one table一张表的多个关联
【发布时间】:2011-08-14 16:04:34
【问题描述】:

在问这个之前我已经搜索了一下,但我绝对无法让它工作......

我有一个 Group 模型,它有一个 manager_id、一个 Designer_id 和其他用户 id,对应于该组中的不同用户角色。它们是 Group 模型中具有不同外键的 has_one 用户关联。

我在 User 模型中尝试了多个 belongs_to 关联,但是......属于组的用户(他们有一个 group_id 列)可以是这些角色之一,我真的不知道如何检查这些和如何在 User 模型中进行关联。

提前谢谢你。

PS:用户只能属于一个组,这就是为什么我只是将 group_id 放在 User 模型中,而不是放在连接表中。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    如果在某个组中担任经理或设计师意味着某人是该组的成员,那么您无法轻松做到这一点,您应该创建一个成员模型,该模型具有一个“角色”属性来说明哪个角色用户代表特定组,如下所示:

    class User
      has_one :membership
    end
    
    class Group
      has_many :memberships
    end
    
    class Membership
      belongs_to :group
      belongs_to :user
      validates_presence_of :role
      validates_inclusion_of :role, :in => [ 'manager', 'designer', 'member' ]
      validates_uniqueness_of :user_id, :scope => :group_id
    end
    

    这为您提供了功能,甚至允许您为您的组定义尽可能多的角色

    【讨论】:

    • 我想这就是我要找的东西!在将其标记为已解决之前,我正在对其进行测试。谢谢。
    【解决方案2】:

    belongs_to 比你想象的更强大

    例如,要在用户上创建关于经理的 belongs_to 关联

    在您的用户类中:

    belongs_to :manager, :primary_key => :manager_id, :class_name => "User"
    

    将执行查询,查询 User(s) 表中的 manager_idfield 与 Group(s) 表中的 manager_id 匹配的位置。

    或者,如果用户表中的列称为“manager_id”:

    belongs_to :manager, :foreign_key => :my_manager_id, :primary_key => :manager_id
    

    这会将 User(s) 表中的 my_manager_id 列与 Group(s) 表中的 manager_id 列匹配。

    那么你应该可以做到:

    user.manager.exists?
    

    你有什么

    编辑:我也可能不太了解您的数据模型,但我认为这种方法也可能适用于has_one :manager, :through => :group 的情况。 has_one :manager, :through => :group,例如。除了 :foreign_keyclass_name 在这些情况下不起作用,根据 has_on 的文档,因为“:class_name 和 :foreign_key 的选项被忽略,因为关联使用源反射”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多