Отношения Rails: дважды ссылаться на одну и ту же таблицу в отношениях «многие ко многим».

Я довольно новичок в рельсах и пытаюсь выяснить отношения.

Данные, которые я пытаюсь смоделировать, выглядят следующим образом: Событие — это собрание, на котором люди играют в игры. Событие записывается в несколько видео. Видео содержит несколько игровых наборов. В GameSet есть два Player, player_one и player_two.

Поскольку у события есть много видео, а у видео много игровых наборов, я чувствую, что должен иметь возможность объявить отношение has_many :through, чтобы перейти прямо от события к игровым наборам. Кроме того, я должен иметь возможность сразу переходить от игрока ко всем игровым наборам, в которых он участвовал.

Вот что у меня есть:

class Event < ActiveRecord::Base
  attr_accessible :event_date, :event_name, :event_number, :city, :state, :game_sets, :videos
  has_many :videos
  has_many :game_sets, :through => :videos
end

class Video < ActiveRecord::Base
  attr_accessible :name, :url, :event, :game_sets
  belongs_to :event
  has_many :game_sets
end

class GameSet < ActiveRecord::Base
  attr_accessible :player_one, :player_two, :video
  belongs_to :video
  has_one :player_one, :class_name => "Player"
  has_one :player_two, :class_name => "Player"
end

class Player < ActiveRecord::Base
  attr_accessible :first_name, :handle, :home_city, :home_state, :last_name, :tag
  has_and_belongs_to_many :game_sets
end

Но когда я пытаюсь выполнить код вроде:

GameSet.find_by_id(1).player_one 

Я получаю следующее исключение.

?[1m?[36mGameSet Load (0.0ms)?[0m  ?[1mSELECT "game_sets".* FROM "game_sets" WHERE "game_sets"."id" = 1 LIMIT 1?[0m  ?[1m?[35mPlayer Load (1.0ms)
?[0m  SELECT "players".* FROM "players" WHERE "players"."game_set_id" = 1 LIMIT 1SQLite3::SQLException: no such column: players.game_set_id: SELECT  "players".* FROM "players"  WHERE "players"."game_set_id" = 1 LIMIT 1ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: players.game_set_id: SELECT  "players".* FROM "players"  WHERE "players"."game_set_id"= 1 LIMIT 1

Я не могу на всю жизнь понять, что я делаю неправильно. Любая помощь приветствуется.


person Anthony Compton    schedule 03.02.2013    source источник


Ответы (1)


Ваши отношения между GameSet и его игроками неверны. Предполагая, что у вас есть два целочисленных столбца с идентификаторами для player_one и player_two, связь должна быть должна принадлежать_к вместо has_one. В противном случае это будет означать, что Player имеет game_set_id для обратной связи с GameSet.

person mathieugagne    schedule 03.02.2013
comment
Вы знаете, это имеет смысл. Я думаю, что у меня проблемы с отделением токена has_one и его значения от того, что я думаю об отношениях в реальном мире. В реальном мире я думаю, что в игре есть игроки, а не в том, что игра принадлежит игрокам в ней. Но на самом деле я должен думать об отношениях в том смысле, что они представляют в мире базы данных. - person Anthony Compton; 04.02.2013
comment
Только в некоторых случаях это имеет меньше смысла. Обычно это совершенно ясно, когда, например, у Учителя много Учеников через Курс. Курс принадлежит Учителю. Студент имеет и принадлежит ко многим курсам. - person mathieugagne; 04.02.2013
comment
Я буду. Однако у меня еще не было возможности попробовать это. Но я настроен оптимистично. :) - person Anthony Compton; 04.02.2013