Похоже, вы путаете SchemaStatement#add_reference
и TableDefinition#references
, которые имеют совершенно разные подписи.
Если вы хотите настроить столбец внешнего ключа, где таблица не может быть получена из имени столбца (первый аргумент), который вы просто передаете foreign_key: { to_table: :teams}
.
class CreatePlayers < ActiveRecord::Migration[6.0]
def change
create_table :players do |t|
t.references :high_school_team, foreign_key: { to_table: :teams}
t.references :club_team, foreign_key: { to_table: :teams}
end
end
end
t.references :high_school_team, index: true
, как рекомендовано другими ответами, НЕ эквивалентно. Это просто добавляет индекс к столбцу, но без ограничения внешнего ключа.
Затем вы можете настроить ассоциации в Player следующим образом:
class Player < ApplicationRecord
belongs_to :high_school_team, class_name: 'Team'
belongs_to :club_team, class_name: 'Team'
end
Вы не можете использовать одну ассоциацию has_many :players
на другом конце, хотя в качестве столбца внешнего ключа можно указать либо players.high_school_team_id
, либо players.club_team_id
.
class Team
has_many :high_school_team_players,
foreign_key: :high_school_team_id,
class_name: 'Player'
has_many :club_team_players,
foreign_key: :club_team_id,
class_name: 'Player'
end
Но на самом деле лучшей альтернативой, во-первых, была бы установка таблицы соединения:
class Player
has_many :placements
has_one :high_school_team,
through: :placements,
source: :team
class_name: 'Team'
has_one :club_team,
through: :placements,
source: :team
class_name: 'Team'
end
class Placement
belongs_to :player
belongs_to :team
end
class Team
has_many :placements
has_many :players, through: :placements
end