实现多个活动记录关联

时间:2012-06-24 09:41:31

标签: ruby-on-rails activerecord associations

我正在尝试为我的Ruby on Rails应用程序设置模型,模型非常复杂 - 我不确定我是否以正确的方式接近它。阅读Ruby on Rails指南@ guides.rubyonrails.org提供了一些关于Active Record关联的非常好的信息,但它在一定程度上也使我更加困惑。我想要设置的是模拟锦标赛而不是传统锦标赛(如果有人跟随GSL,那就是我想尝试建模的锦标赛)。

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

  • 名称
  • Banner(只是在线托管的图片的网址)
  • 地图池(锦标赛正在使用的地图对象的集合)
  • 玩家(参加此次锦标赛的众多玩家)
  • 32回到决赛(第32,16,8,4,2轮)

这些是我提出的模型:锦标赛,地图池,地图,玩家,种族(即Protoss Terran或Zerg),团队(即玩家所属的团队),Round_of_32,Round_of_16,Round_of_8,Round_of_4, Round_of_2,组(每轮比赛的集合),比赛(每个比赛之间有比赛信息的比赛)和比赛(持有地图和获胜者)。随着应用程序的发展,我将会有越来越多的锦标赛,每个锦标赛都有自己的数据集,即使玩家可能是多个锦标赛的一部分,地图也可以是各个锦标赛的多个地图池的一部分等。

  • 锦标赛有一个包含许多地图的地图池
  • 锦标赛有多名球员,每名球员都与不同的比赛和球队相关联
  • 一轮32人有八组,每组有五场比赛,每场有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

我遗漏了什么或使用不正确的东西吗?

编辑:为什么我为每一轮提供单独的模型是因为Rounds 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

1 个答案:

答案 0 :(得分:0)

我仍然说你的回合应该是一个单一的模型。它们之间的差异似乎是逻辑上的而非结构性的。所以我要做一个Round表并添加type属性(利用单表继承?)。

作为一名SC粉丝,如果你愿意的话,我很乐意帮助他们建模。

另外:玩家> - 比赛?你确定吗?我无法改变比赛甚至锦标赛之间的比赛?!