多个has_many通过同一模型

时间:2020-04-08 07:36:07

标签: ruby-on-rails ruby-on-rails-5

使用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

我知道下面的代码和Pierre Avinain的代码是正确的,但是还有另一种方法可以将队员添加到团队中吗?

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的belongs_to:role移至单独的模型。

1 个答案:

答案 0 :(得分:0)

使用此代码,您无需在所有这些模型之间创建关系。

一个好的方法应该是:

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

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

此外,如果要将这些实例存储到数据库中,请用.new替换所有.create。如果执行PlayerTeam.create,则首先需要在所有其他实例上执行.create,因为PlayerTeam将需要保存roleteamplayer ID。

相关问题