Несколько has_many через одну модель - PullRequest
0 голосов
/ 08 апреля 2020

Используя Rails 5.2.4.2, у меня есть модели:

Team
  has_many :player_teams
  has_many :players, through: :player_teams

Role
  has_many :player_teams
  has_many :players, through: :player_teams

Player
  has_many :player_teams
  has_many :teams, through: :player_teams
  has_many :roles, through: :player_teams

PlayerTeam
  belongs_to :team
  belongs_to :player
  belongs_to :role

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

role = Role.create(...)
team = Team.create(...)
player = Player.create(...)

player.roles << role => Ok
team.players << player => ActiveRecord::RecordInvalid Exception: Validation failed: Player teams team must exist

Обновление 1

Я знаю, что приведенный ниже код и Пьер Авинаин верен, но есть ли другой способ добавить игрока в команду?

player_teams = PlayerTeam.create(team: evaluator.team, role: evaluator.player_role)
player.player_teams << player_teams => Ok

Скажем, я добавил роль игроку

player.roles << Role.create()

И если я добавлю игрока в команду, будет ли запущен новый экземпляр PlayerTeam? Как добавить игрока в команду без нового экземпляра PlayerTeam?

Обновление 2

Похоже, что если я хочу добавить игрока в команду, как я хочу

team.players << player

Чем мне нужно установить необязательное значение: true или отдельную таблицу объединения ролей, чтобы переместить PlayerTeam's положение_to: роль в отдельную модель.

1 Ответ

0 голосов
/ 08 апреля 2020

С помощью этого кода вы не создаете отношения между всеми этими моделями.

Хороший способ сделать это должен быть:

role = Role.new(...)
team = Team.new(...)
player = Player.new(...)

playerTeam = PlayerTeam.new(role: role,
                            team: team,
                            player: player)

Более того, если вы хотите эти экземпляры хранится в вашей БД, замените все .new на .create. Если вы делаете PlayerTeam.create, вам сначала нужно сделать .create для всех остальных экземпляров, потому что PlayerTeam потребует сохранения идентификаторов role, team и player.

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