在同一模型轨道中具有多对多关联

时间:2015-09-28 11:40:59

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

我有一个名为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仍然有点新意。

2 个答案:

答案 0 :(得分:0)

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

  • 如果您确定不会有任何其他角色
    • 您可以使用boolean领导者,如果表示此用户是成员,则可以是true或false
  • 如果您不确定是否可能有其他任何角色
    • 您可以使用当前使用的type列,并且可以包含第一部分的memberleader

然后您需要leader来控制许多members,然后有2个可能性:

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

    has_many :members, :class_name => "User", :foreign_key => :leader_id
    
  • 会员可以属于很多领导者,那么你需要创建多对多关系,然后使用包含leader_idmember_id的新表,两者都应该引用用户表作为forigen键。

并且优于所有并且在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

答案 1 :(得分:0)

将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