【问题标题】:Having a many-to-many association in the same model rails在同一模型导轨中具有多对多关联
【发布时间】:2015-09-28 20:12:33
【问题描述】:

我有一个名为 User 的模型,对于我的模型,用户可以是领导者或成员。在我的用户模型中,我有这个

class User < ActiveRecord::Base
  attr_accessible :username, :type
end

我想我可以像这样在用户模型中创建多对多关联

class User < ActiveRecord::Base
  attr_accessible :username, :type

  has_and_belongs_to_many :users, :join_table => :team_members, :foreign_key => :team_leader_id
end

但我不确定如何去做。举个例子。 用户 1 - 类型:领导者 用户 2 - 类型:成员 用户 3 - 类型:成员。

我想创建一个关系,可以表明用户 1 是用户 2 和用户 3 的领导者。

我对 rails 还是有点陌生​​。

【问题讨论】:

  • 您有member 型号和leader 型号吗?如果是这样,最好在其中定义它们。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

将leader_id添加到用户

 class User < ActiveRecord::Base
  attr_accessible :username, :type

  belongs_to :leader, class: User
  has_many :members, class: User, foreign_key: :leader_id
end

使用:

@user_1 = User.create(name: "Jhon")
@user_2 = User.create(name: "Tom", leader: @user_1)

@user_1.members

【讨论】:

    【解决方案2】:

    嗯,你有User 表,用户可以是成员或领导,

    • 如果您确定不会有任何其他角色
      • 您可以使用boolean 领导者,如果为假,则可以为真或假,表示此用户是会员
    • 如果您不确定是否还有其他角色
      • 您可以使用您当前正在使用的type 列,并且可以包含memberleader 这是第一部分。

    那么你需要leader 来控制许多members 那么有两种可能性:

    • 成员只能属于 1 个领导者,那么您将需要在名为 leader_id 的用户表中添加一个新列,例如,在这种情况下它将是

      has_many :members, :class_name => "User", :foreign_key => :leader_id
      
    • 成员可以属于多个领导者,那么您将需要创建多对多关系,然后将使用包含leader_idmember_id 的新表,并且两者都应将用户表作为外来键引用.


    而且比所有都更好,并且在 User 模型中具有这种关系,并且它仅对 Leader 有效,您可以拥有 2 个从 User 继承的模型,称为 STI Single Table Inheritance 您可以阅读更多关于它here:

    class User < ActiveRecord::Base
      # this type will be checked if Leader then its Leader model if Member then its Member model
      self.inheritance_column = 'type'
    end
    
    
    class Member < User
    end
    
    class Leader < User
      has_many :members, :class_name => "User", :foreign_key => :leader_id
    end
    

    这个模型比所有模型都好,在这种情况下,假设在你的用户模型中你有:

    1  User type='Member'
    2  User type='Leaeder'
    

    如果你说:

     # will work      
     Member.find 1 
     User.find 1
     # will fail as type is not Leader
     Leader.find 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2021-05-25
      • 2023-02-26
      • 2011-11-15
      相关资源
      最近更新 更多