我正在尝试为我的 Ruby on Rails 应用程序设置模型,这些模型非常复杂——我不确定我是否以正确的方式接近它。阅读 Ruby on Rails 指南 @guides.rubyonrails.org 提供了一些关于 Active Record 关联的非常好的信息,但它在一定程度上也让我更加困惑。我试图建立的是模拟锦标赛而不是传统锦标赛的东西(如果有人遵循 GSL,那就是我想尝试建模的锦标赛)。
锦标赛模型存储以下信息:
- 姓名
- 横幅(只是在线托管图片的网址)
- 地图池(用于锦标赛的地图对象的集合)
- 球员(参加本次比赛的球员人数)
- 32强进入决赛(32、16、8、4、2轮)
这些是我想出的模型:锦标赛、地图池、地图、玩家、种族(即 Protoss 人族或虫族)、团队(即玩家所属的团队)、Round_of_32、Round_of_16、Round_of_8、Round_of_4、Round_of_2、Group (每轮比赛的集合)、Match(包含玩家之间每场比赛的信息的集合)和 Game(包含地图和获胜者)。随着应用程序的开发,我将拥有越来越多的锦标赛,每个锦标赛都有自己的数据集,即使玩家可能是多个锦标赛的一部分,地图可能是他们各自锦标赛的多个地图池的一部分,等等。
- 锦标赛有一个地图池,其中包含许多地图
- 一场锦标赛有多个玩家,每个玩家都与不同的种族和球队相关联
- 一轮32分8组,每组5场,每组3场
- 16 轮与 32 轮类似,但只有四组
- 8强赛只有4场比赛,每场5场
- 一轮 4 有 2 场比赛,每场 5 场比赛
- 一轮 2 有 1 场比赛,每场有 7 场比赛
这是我到目前为止所拥有的:
TOURNAMENT
:league
:banner
has_one :map_pool
has_many :maps, :through => :map_pool
has_and_belongs_to_many :players
# has_many :rounds
has_one :ro32
has_one :ro16
has_one :ro8
has_one :ro4
has_one :ro2
MAP_POOL
belongs_to :tournament
has_many :maps
MAP
:name
belongs_to :map_pool
has_many :games
PLAYER
:name
belongs_to :race
belongs_to :team
has_and_belongs_to_many :tournaments
has_many :games
RACE
:type {"Protoss", "Terran", "Zerg"}
has_many :players
TEAM
:name
has_many :players
RO32
belongs_to :tournament
has_many :groups, :as => :round,
:limit => 8
RO16
belongs_to :tournament
has_many :groups, :as => :round,
:limit => 4
RO8
belongs_to :tournament
has_many :matches, :as => :matchup,
:limit => 4
RO4
belongs_to :tournament
has_many :matches, :as => :matchup,
:limit => 2
RO2
belongs_to :tournament
has_many :matches, :as => :matchup,
:limit => 1
GROUP
:name
belongs_to :round, :polymorphic => true
has_many :matchups, :as => :matchup
MATCH
:type {"bo3", "bo5", "bo7"}
has_many :games
belongs_to :matchup, :polymorphic => true
GAME
belongs_to :match
has_one :map
has_one :player
我是否遗漏了任何东西或错误地使用了任何东西?
编辑:我为每一轮都有单独的模型的原因是因为第 32/16 轮与第 8/4/2 轮不同。这是一组示例数据,可以解释我遇到的问题:
Round of 32:
Group A:
Match 1: P1 vs P2
Game 1
Game 2
Game 3
Match 2: P3 vs P4
Game 1
Game 2
Game 3
Winners Match: P1 (winner match 1) vs P4 (winner match 2)
Game 1
Game 2
Game 3
Losers Match: P2 (loser match 1) vs P3 (loser match 2)
Game 1
Game 2
Game 3
Tiebreak Match: P4 (loser of winners match) vs P2 (winner of losers match)
Game 1
Game 2
Game 3
[etc. Group B through Group H]
Round of 16:
[similar to Round of 32 but only groups A through D]
Round of 8:
Match 1: P1 vs P2
Game 1
Game 2
Game 3
Game 4
Game 5
Match 2: P3 vs P4
Game 1
Game 2
Game 3
Game 4
Game 5
Match 3: P5 vs P6
Game 1
Game 2
Game 3
Game 4
Game 5
Match 4: P7 vs P8
Game 1
Game 2
Game 3
Game 4
Game 5