复杂 Rails Models/Associations
Complex Rails Models/Associations
我正在为裁判建立一个分配系统。
问题
我问这个问题 previously/slightly 不同,但 运行 又惹上麻烦了。我基本上有 5 个模型需要链接在一起,但我无法在网上找到 specify/guide 的资源来解决超过 3 个 table 的问题。我想我暂时已经确定了它,我可以在控制台中拉出我需要的东西,但它似乎到处都是。
简单英语模型:
- League - 设计可以登录并通过表单上传时间表(创建游戏)的用户
- 分配者 - 设计用户然后采用该时间表并将裁判分配给比赛
- 裁判 - 设计分配给游戏的用户
- 游戏 - 由联盟创建(包含球队、场地、指定的裁判组)
- 分配 - 在 League 创建游戏时创建
我的models/associations是:
class Assignor < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :games
has_many :referees
has_many :assignments, through: :games
belongs_to :league
end
class Referee < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
belongs_to :assignor
has_and_belongs_to_many :games
has_many :assignments, through: :games
end
class Game < ApplicationRecord
belongs_to :league
belongs_to :assignor
has_and_belongs_to_many :referees
has_one :assignment
end
class Assignment < ApplicationRecord
belongs_to :assignor
belongs_to :referee
belongs_to :game
end
class League < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_one :assignor
has_many :games
end
编辑 - 我遇到的实际问题
对于有 1 名以上裁判的作业,我是否需要更改 table 以反映这一点?现在 table 如下,允许一个 referee 但我最多需要 4 个 Assignment:
create_table "assignments", force: :cascade do |t|
t.integer "assignor_id", null: false
t.integer "referee_id", null: false
t.integer "game_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["assignor_id"], name: "index_assignments_on_assignor_id"
t.index ["game_id"], name: "index_assignments_on_game_id"
t.index ["referee_id"], name: "index_assignments_on_referee_id"
end
如何建模,使 table 看起来像:
reate_table "assignments", force: :cascade do |t|
t.integer "assignor_id", null: false
t.integer "game_id", null: false
t.integer "center_referee", null: false
t.integer "assistant_referee_one", null: false
t.integer "assistant_referee_two", null: false
t.integer "fourth_official", null: false
end
创建另一个 model/replace 另一个模型并将其命名为“crew_referee”以将裁判与比赛相关联会更好吗?
最终目标
我希望能够让 League 创建一个由 Games 组成的时间表,Assignor 分配 裁判通过作业。
我的想法是,基本上我希望能够让用户登录并查看他们各自的 Games 和 Assignments。
一个可能的解决方案是允许用户为每场比赛创建多个任务,然后他可以分配多个裁判,每个裁判都有不同的角色。
为了反映裁判的角色/类型,您可以在作业中添加另一列 table,其中包含有关作业类型(中心、助理、...)的信息
如果你真的希望每场比赛只有一个分配给 4 名裁判的参考,你可以这样做:
class CreateAssignments < ActiveRecord::Migration[6.1]
def change
create_table :assignments do |t|
t.references :assignor, null: false, foreign_key: true
t.references :game, null: false, foreign_key: true
t.references :center_referee, null: false, foreign_key: { to_table: :referees }
t.references :assistant_referee_one, null: false, foreign_key: { to_table: :referees }
t.references :assistant_referee_two, null: false, foreign_key: { to_table: :referees }
t.references :fourth_official, null: false, foreign_key: { to_table: :referees }
t.timestamps
end
end
end
要通过 Assignment 访问裁判,您可以将以下内容放入 Assignment 模型中:
belongs_to :center_referee, class_name: 'Referee', foreign_key: 'center_referee_id'
belongs_to :assistant_referee_one, class_name: 'Referee', foreign_key: 'assistant_referee_one_id'
...
我正在为裁判建立一个分配系统。
问题 我问这个问题 previously/slightly 不同,但 运行 又惹上麻烦了。我基本上有 5 个模型需要链接在一起,但我无法在网上找到 specify/guide 的资源来解决超过 3 个 table 的问题。我想我暂时已经确定了它,我可以在控制台中拉出我需要的东西,但它似乎到处都是。
简单英语模型:
- League - 设计可以登录并通过表单上传时间表(创建游戏)的用户
- 分配者 - 设计用户然后采用该时间表并将裁判分配给比赛
- 裁判 - 设计分配给游戏的用户
- 游戏 - 由联盟创建(包含球队、场地、指定的裁判组)
- 分配 - 在 League 创建游戏时创建
我的models/associations是:
class Assignor < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :games
has_many :referees
has_many :assignments, through: :games
belongs_to :league
end
class Referee < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
belongs_to :assignor
has_and_belongs_to_many :games
has_many :assignments, through: :games
end
class Game < ApplicationRecord
belongs_to :league
belongs_to :assignor
has_and_belongs_to_many :referees
has_one :assignment
end
class Assignment < ApplicationRecord
belongs_to :assignor
belongs_to :referee
belongs_to :game
end
class League < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_one :assignor
has_many :games
end
编辑 - 我遇到的实际问题
对于有 1 名以上裁判的作业,我是否需要更改 table 以反映这一点?现在 table 如下,允许一个 referee 但我最多需要 4 个 Assignment:
create_table "assignments", force: :cascade do |t|
t.integer "assignor_id", null: false
t.integer "referee_id", null: false
t.integer "game_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["assignor_id"], name: "index_assignments_on_assignor_id"
t.index ["game_id"], name: "index_assignments_on_game_id"
t.index ["referee_id"], name: "index_assignments_on_referee_id"
end
如何建模,使 table 看起来像:
reate_table "assignments", force: :cascade do |t|
t.integer "assignor_id", null: false
t.integer "game_id", null: false
t.integer "center_referee", null: false
t.integer "assistant_referee_one", null: false
t.integer "assistant_referee_two", null: false
t.integer "fourth_official", null: false
end
创建另一个 model/replace 另一个模型并将其命名为“crew_referee”以将裁判与比赛相关联会更好吗?
最终目标 我希望能够让 League 创建一个由 Games 组成的时间表,Assignor 分配 裁判通过作业。
我的想法是,基本上我希望能够让用户登录并查看他们各自的 Games 和 Assignments。
一个可能的解决方案是允许用户为每场比赛创建多个任务,然后他可以分配多个裁判,每个裁判都有不同的角色。
为了反映裁判的角色/类型,您可以在作业中添加另一列 table,其中包含有关作业类型(中心、助理、...)的信息
如果你真的希望每场比赛只有一个分配给 4 名裁判的参考,你可以这样做:
class CreateAssignments < ActiveRecord::Migration[6.1]
def change
create_table :assignments do |t|
t.references :assignor, null: false, foreign_key: true
t.references :game, null: false, foreign_key: true
t.references :center_referee, null: false, foreign_key: { to_table: :referees }
t.references :assistant_referee_one, null: false, foreign_key: { to_table: :referees }
t.references :assistant_referee_two, null: false, foreign_key: { to_table: :referees }
t.references :fourth_official, null: false, foreign_key: { to_table: :referees }
t.timestamps
end
end
end
要通过 Assignment 访问裁判,您可以将以下内容放入 Assignment 模型中:
belongs_to :center_referee, class_name: 'Referee', foreign_key: 'center_referee_id'
belongs_to :assistant_referee_one, class_name: 'Referee', foreign_key: 'assistant_referee_one_id'
...