Has_many: через в Rails.Могу ли я иметь два внешних ключа? - PullRequest
1 голос
/ 05 февраля 2012

Я новичок в rails и пытаюсь создать схему базы данных, которая выглядит следующим образом:

Есть много совпадений.В каждом матче 2 команды.

В команде много матчей.

Модель команды и модель матча объединены в таблице соревнований.match_id и team1_id и team2_id.

Но я не знаю, как сделать эту работу или если это даже лучший способ сделать это.Я не знаю, как сделать некоторые команды team1 и другие team2 .... два внешних ключа?Это возможно?

Таблица соответствия также должна содержать дополнительные данные, такие как team1_points и team2_points, победитель и проигравший и т. Д.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

В таблице может быть столько внешних ключей, сколько вы хотите. Я написал приложение, которое включало планирование команд, играющих в игры.

Способ, которым я справился с этим в классе Game со следующим:

class Game < ActiveRecord::Base
  belongs_to :home_team, :class_name => 'Team', :foreign_key => 'team1_id'
  belongs_to :visitor_team, :class_name => 'Team', :foreign_key => 'team2_id'

Вы можете добавить соответствующие поля для team1_points, team2_points и т. Д. Вам необходимо настроить модель вашей команды с помощью чего-то вроде:

class Team < ActiveRecord::Base
  has_many :home_games, :class_name => 'Game', :foreign_key => 'team1_id'
  has_many :visitor_games, :class_name => 'Game', :foreign_key => 'team2_id'

  def games
    home_games + visitor_games
  end

  #important other logic missing
end

Обратите внимание, что некоторые из моих соглашений об именах были результатом работы с устаревшей базой данных.

1 голос
/ 09 декабря 2013

Я столкнулся с аналогичной проблемой и, расширив предыдущий ответ, сделал следующее:

class Game < ActiveRecord::Base

  def self.played_by(team)
    where('team1_id = ? OR team2_id = ?', team.id, team.id)
  end
end

class Team < ActiveRecord::Base

  def games
    @games ||= Game.played_by(self)
  end
end

Таким образом, Team#games возвращает ActiveRecord::Relation вместо Array, так что вы можетепродолжайте цеплять другие области.

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