假设我有Users表和Team表。
在Rails中,我知道如何将Team表中的user_id列链接到Users表。但是,如果我有第二列,我也想链接到用户的表,例如user_id2(这实际上是在团队表中创建了一个订单)?
是否有解决方案,或者我不知道要做我正在尝试的事情?我也不认为“has_many”是我正在寻找的,因为user_id可能是团队经理,而user_id2可能是团队队长,即他们有不同的角色隶属于他们,并且订单很重要。
谢谢!
编辑:出于我的目的,我也不需要超过这两个用户关系。 (即三个案件不相关)
答案 0 :(得分:0)
您可能需要查看STI(在该页面上查找单表继承)或Polymorphic Associations。要么你可以更清楚地表达你的意图,尽管你的问题中没有足够的信息可以解决哪个问题最合适。
给他们一个阅读,看看他们是否达到了你想要的效果。
答案 1 :(得分:0)
首先,这是一种在一个方向上执行此操作的方法(团队 - >用户),但它不适用于反向,并且我会在之后进行更好的选择。第一个假设您在manager_id
表上有captain_id
和teams
列。
class User < ActiveRecord::Base
end
class Team < ActiveRecord::Base
belongs_to :manager, :class_name => ::User
belongs_to :captain, :class_name => ::User
end
但是,如果一个团队只包含两个用户(经理和队长),我会感到惊讶 - 您更有可能希望联接表跟踪所有用户的团队成员资格。该连接表(在此示例中称为team_memberships
)可以包含role
列,其中包含经理/队长信息以及您拥有的任何其他数据。这种方式更加灵活,并提供额外的好处,例如,如果团队成员随着时间的推移而变化,他们能够跟踪历史团队数据。
class Team < ActiveRecord::Base
has_many :team_memberships
has_many :users, :through => :team_memberships
def captain
team_memberships.captain.first
end
def manager
team_memberships.manager.first
end
end
class TeamMembership < ActiveRecord::Base
belongs_to :user
belongs_to :team
# You'll need some database-level UNIQUE INDEXes here to make sure
# you don't get multiple captains / managers per team, and also
# some validations to help with error messages.
named_scope :captain, :conditions => {:role => "captain"}
named_scope :manager, :conditions => {:role => "manager"}
end
class User < ActiveRecord::Base
# depending on the rules about teams, maybe these should be has_many...
has_one :team_membership
has_one :team, :through => :team_memberships
end
查看http://guides.rubyonrails.org/association_basics.html了解详情。