Rails: двунаправленный has_many: сквозные отношения - PullRequest
0 голосов
/ 24 мая 2010

У меня есть три модели в приложении Rails: Game представляет экземпляр игры, в которую играют. Player представляет экземпляр участника в игре. User представляет зарегистрированное лицо, которое может участвовать в играх.

Каждый Game может иметь много Players, а каждый User может иметь много Players (один человек может участвовать в нескольких играх одновременно); но каждый Player находится точно в одном Game и представляет точно один User. Следовательно, мои отношения в настоящее время таковы.

class Game
  has_many :players
end

class User
  has_many :players
end

class Player
  belongs_to :game
  belongs_to :user
end

... где, естественно, таблица players имеет столбцы game_id и user_id, а games и users не имеют внешних ключей.

Я также хотел бы представить тот факт, что в каждом Game есть много Users, играющих в нем; и у каждого User есть много Games, в которые они играют. Как мне это сделать? Достаточно ли добавить

class Game
  has_many :users, :through => :players
end

class User
  has_many :games, :through => :players
end

1 Ответ

1 голос
/ 24 мая 2010

То, что вы предлагаете, должно быть достаточно; Теперь у каждой игры должен быть массив users [], а у каждого пользователя - массив games [].

http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

: has_many: through в основном является расширением типичной модели «многие ко многим», где у вас есть промежуточная таблица с идентификаторами для каждого из связанных объектов. Однако в Rails отношение: has_and_belongs_to_many не позволяет промежуточной таблице быть сущностью самой по себе, поскольку она не имеет никакого значения, кроме как служить связующим звеном между двумя связанными моделями.

: has_many: through позволяет реальной сущности или модели в приложении (в вашем случае, игрокам) действовать как «связующее звено» между двумя другими (играми, пользователями), но также позволяет вам манипулировать «игроками», как в этом случае он содержит важную информацию.

Надеюсь, это поможет.

...