Связывание 2-й строки с другой таблицей базы данных в рельсах - PullRequest
0 голосов
/ 25 декабря 2010

Допустим, у меня есть таблица Users и таблица Team.

В Rails я знаю, как связать столбец user_id в таблице Team с таблицей Users.Но что, если у меня есть второй столбец, я также хочу связать с таблицей пользователя, например, user_id2 (это, по сути, создает порядок в таблице группы)?

Есть решение или что-то, чего я не могузнаете, делать то, что я пытаюсь?Я также не думаю, что "has_many" - это то, что я ищу, потому что user_id может быть менеджером команды, а user_id2 может быть капитаном команды, то есть у них разные связанные с ними роли, и порядок важен.

Спасибо!

Редактировать: для моих целей мне также не понадобилось бы больше, чем эти два взаимодействия с пользователем.(т. е. случаи для трех не будут актуальны)

Ответы [ 2 ]

0 голосов
/ 25 декабря 2010

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

0 голосов
/ 25 декабря 2010

Возможно, вы захотите посмотреть STI (ищите Наследование отдельных таблиц на этой странице) или Полиморфные ассоциации .Любой из них позволил бы вам выразить свое намерение немного более четко, хотя в вашем вопросе недостаточно информации, чтобы я мог разобраться, что подойдет лучше всего.

Дайте им прочитать и посмотрите, смогут ли они выполнить то, что выхочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...