0

Ruby on Railsアプリのモデルをセットアップしようとしていますが、モデルは非常に複雑です。正しい方法でアプローチしているかどうかはわかりません。Ruby onRailsガイド@guides.rubyonrails.orgを読むと、Active Recordの関連付けに関するかなり良い情報が得られますが、ある程度混乱することもあります。私が設定しようとしているのは、トーナメントをモデル化するものですが、従来のトーナメントではありません(GSLをフォローしている人がいる場合は、それをモデル化してみたいトーナメントです)。

トーナメントモデルには、次の情報が格納されています。

  • 名前
  • バナー(オンラインでホストされている画像へのURLのみ)
  • マッププール(トーナメントで使用されているマップオブジェクトのコレクション)
  • プレイヤー(このトーナメントに参加しているプレイヤーの数)
  • 決勝までの32ラウンド(32、16、8、4、2ラウンド)

私が思いついたモデルは次のとおりです。トーナメント、マッププール、マップ、プレーヤー、レース(つまり、Protoss TerranまたはZerg)、チーム(つまり、プレーヤーが属するチーム)、Round_of_32、Round_of_16、Round_of_8、Round_of_4、Round_of_2、Group (ラウンドごとの試合のコレクション)、試合(プレーヤー間の試合ごとの情報を含むコレクション)、およびゲーム(マップと勝者を保持する)。アプリが開発されるにつれて、プレーヤーが複数のトーナメントに参加したり、マップがそれぞれのトーナメントの複数のマッププールに参加したりする場合でも、それぞれが独自のデータセットを持つトーナメントが増えていきます。

  • トーナメントには、多数のマップを含むマッププールがあります
  • トーナメントには複数のプレーヤーがいて、それぞれが異なるレースとチームに関連付けられています
  • 32ラウンドには8つのグループがあり、それぞれに5つの試合があり、それぞれに3つのゲームがあります。
  • 16ラウンドは32ラウンドに似ていますが、グループは4つしかありません。
  • 8ラウンドは、それぞれ5ゲームの4試合のみです。
  • 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
4

1 に答える 1

0

あなたのラウンドは単一のモデルであるべきだと私はまだ言います。それらのタイプの違いは構造的ではなく論理的であるようです。したがって、ラウンド テーブルを作成して type 属性を追加します (単一テーブルの継承を利用しますか?)。

仲間の SC ファンとして、よろしければモデル化のお手伝いをさせていただきます。

また: プレーヤー >-- レース ? 本気ですか?ゲーム間やトーナメント間でレースを変更することはできません?!

于 2012-06-24T21:33:47.033 に答える