Rails 协会结构

Rails Associations Structure

如何构建这 3 个具有关联的模型?

问题

我在为我正在进行的个人项目设置模型关联时遇到了很多麻烦。本质上,我正在构建一个由 3 个模型组成的裁判分配系统:

  1. 指定人:为比赛指定裁判的用户
  2. 裁判:分配给游戏的用户
  3. 比赛:分配了 1-4 名裁判

到目前为止我的模型是:

class Assignor < ApplicationRecord
  has_many :games
  has_many :referees
  has_many :assigned_referees, through:referees
end

class Game < ApplicationRecord
  belongs_to :assignor
  has_many :referees
end

class Referee < ApplicationRecord
  has_many :assignors
  has_many :games, through: :assignor
  has_many :assigned_games, :through:assignor
end 

我想在我的应用中对这些关联做的是:

  1. 列出指定人拥有的裁判 => Assignor.referees
  2. 列出裁判拥有的指定人 => Referee.assignors

我遇到问题的地方是...

  1. 列出分配给一场比赛的裁判
  2. 列出未分配给比赛的裁判 -例如: 如果用户(分配者)要启动游戏并分配裁判,我想制作一个下拉列表,其中包含未分配的裁判列表

我只想加入 3 种方式 table:

class Game < ApplicationRecord
  has_many :referee_assignments
  has_many :referees, 
    through: :referee_assignments,
    inverse_of: :assigned_games
  has_many :assigners, 
    through: :referee_assignments

  def build_assignment(referee:, assigner:)
    referee_assignments.new(
      referee: referee.
      assigner: assigner
    )
  end
end

class RefereeAssignment
  # User who assigned the referee
  belongs_to :assigner, 
    class_name: 'User'
  belongs_to :game
  belongs_to :referee
end

class Referee < ApplicationRecord
  has_many :referee_assignments
  has_many :assigners, 
    through: :referee_assignments
  has_many :assigned_games,
    through: :referee_assignments,
    source: :game,
    inverse_of: :referees

  def build_assignment(game:, assigner:)
    referee_assignments.new(
      game: game,
      assigner: assigner
    )
  end
end 

List the referees assigned to a game

game = Game.find(1)
game.referees.each do |r|
  # ...
end

List the referees not assigned to a game

referees = Referee.where.not(
  id: game.referees
)

使用子查询是最简单的方法,但您也可以使用 NOT EXIST 或连接。