Rails 协会结构
Rails Associations Structure
如何构建这 3 个具有关联的模型?
问题
我在为我正在进行的个人项目设置模型关联时遇到了很多麻烦。本质上,我正在构建一个由 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
我想在我的应用中对这些关联做的是:
- 列出指定人拥有的裁判 => Assignor.referees
- 列出裁判拥有的指定人 => Referee.assignors
我遇到问题的地方是...
- 列出分配给一场比赛的裁判
- 列出未分配给比赛的裁判
-例如:
如果用户(分配者)要启动游戏并分配裁判,我想制作一个下拉列表,其中包含未分配的裁判列表
我只想加入 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
或连接。
如何构建这 3 个具有关联的模型?
问题
我在为我正在进行的个人项目设置模型关联时遇到了很多麻烦。本质上,我正在构建一个由 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
我想在我的应用中对这些关联做的是:
- 列出指定人拥有的裁判 => Assignor.referees
- 列出裁判拥有的指定人 => Referee.assignors
我遇到问题的地方是...
- 列出分配给一场比赛的裁判
- 列出未分配给比赛的裁判 -例如: 如果用户(分配者)要启动游戏并分配裁判,我想制作一个下拉列表,其中包含未分配的裁判列表
我只想加入 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
或连接。