ruby-on-rails 多个具有通过同一模型的多个

cunj1qz1  于 2022-12-20  发布在  Ruby
关注(0)|答案(1)|浏览(124)

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

如果我把球员加入球队,新的球员团队示例会被启动吗?如果没有新的球员团队示例,如何把球员加入球队?

更新2

看起来如果我想把球员加到队伍里

team.players << player

比我需要设置可选:true或单独的Role连接表将PlayerTeam的belongs_to:角色移动到单独的模型。

4nkexdtk

4nkexdtk1#

使用这段代码,您不会在所有这些模型之间创建关系。
这样做的好方法应该是:

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

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

此外,如果您希望将这些示例存储到DB中,请将所有.new替换为.create。如果您执行PlayerTeam.create,则需要首先对所有其他示例执行.create,因为PlayerTeam将要求保存roleteamplayer ID。

相关问题