Во-первых, здесь есть способ сделать это в одном направлении (Команда -> Пользователь), но это не сработает для обратного направления, и есть лучший вариант, который я выберу позже. Первый предполагает, что у вас есть столбцы с именами 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 для более подробной информации.