Ruby on rails 多个活动记录关联的实现

Ruby on rails 多个活动记录关联的实现,ruby-on-rails,activerecord,associations,Ruby On Rails,Activerecord,Associations,我正在尝试为我的RubyonRails应用程序建立模型,这些模型非常复杂——我不确定我是否以正确的方式实现了它。阅读RubyonRailsGuides@guides.rubyonrails.org提供了一些关于活动记录关联的非常好的信息,但在某种程度上它也让我更加困惑。我试图建立的是一个模拟比赛的东西,而不是一个传统的比赛(如果有人遵循GSL,那就是我想尝试模拟的比赛) 锦标赛模型存储以下信息: 名字 横幅(只是一个在线图片的url) 地图池(用于锦标赛的地图对象的集合) 球员(参加本次比赛的

我正在尝试为我的RubyonRails应用程序建立模型,这些模型非常复杂——我不确定我是否以正确的方式实现了它。阅读RubyonRailsGuides@guides.rubyonrails.org提供了一些关于活动记录关联的非常好的信息,但在某种程度上它也让我更加困惑。我试图建立的是一个模拟比赛的东西,而不是一个传统的比赛(如果有人遵循GSL,那就是我想尝试模拟的比赛)

锦标赛模型存储以下信息:

  • 名字
  • 横幅(只是一个在线图片的url)
  • 地图池(用于锦标赛的地图对象的集合)
  • 球员(参加本次比赛的球员人数)
  • 第32轮进入决赛(第32、16、8、4、2轮)
这些是我提出的模型:锦标赛、地图池、地图、玩家、种族(即神族人族或虫族)、团队(即玩家所属的团队)、第32轮、第16轮、第8轮、第4轮、第2轮、小组(每轮的比赛集合)、比赛(玩家之间每次比赛都有信息的集合)和游戏(里面有一张地图和一个优胜者)。随着应用程序的发展,我将有越来越多的比赛,每个比赛都有自己的数据集,尽管玩家可能是多个比赛的一部分,地图可能是各自比赛的多个地图池的一部分,等等

  • 锦标赛有一个包含许多地图的地图池
  • 一场比赛有多个球员,每个人都与不同的种族和球队有关
  • 一轮32人的比赛分为八组,每组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
我是否遗漏了任何内容或使用了任何错误的内容

EDIT:我之所以对每一轮都有单独的模型,是因为第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

我仍然认为您的轮次应该是一个单一模型。它们之间的差异似乎是逻辑上的,而不是结构上的。所以我会做一个圆桌会议,并添加类型属性(利用单表继承?)

作为SC的粉丝,如果你愿意的话,我很乐意帮你做模型


另外:玩家>--种族?你确定吗?我不能在游戏之间甚至锦标赛之间更改种族?!

很酷,谢谢你提供了关于回合模式的提示。另外,对于玩家/种族问题,你提出了一个很好的观点。我只是认为这会使搜索更容易一些(即,不必搜索所有类型为“种族”的玩家),在更改玩家的种族时,每场比赛都有一个表格可能需要更多的工作,但这会使查找速度更快)呃,我想你不明白我的种族建议。我这样组织它。
player>-参与-
,参与表格将保存有关种族的数据。(这也将允许未来进行1+v1+游戏)。