我有一个名为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仍然有点新意。
答案 0 :(得分:0)
嗯,你有User
表,用户可以是成员或领导者,
boolean
领导者,如果表示此用户是成员,则可以是true或false type
列,并且可以包含第一部分的member
或leader
。然后您需要leader
来控制许多members
,然后有2个可能性:
会员只能属于1个领导者,那么您需要在名为leader_id
的用户表中添加新列,在这种情况下,它将是
has_many :members, :class_name => "User", :foreign_key => :leader_id
会员可以属于很多领导者,那么你需要创建多对多关系,然后使用包含leader_id
和member_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