2012-06-24 2 views
0

Я пытаюсь настроить модели для своего приложения Ruby on Rails, и модели довольно сложны - я не уверен, что я подхожу к ней правильным образом. Чтение на Ruby on Rails руководства @ guide.rubyonrails.org дает довольно неплохую информацию об ассоциациях Active Record, но это еще больше смущает меня. То, что я пытаюсь настроить, - это то, что моделирует турнир, но не традиционный турнир (если кто-то следует за GSL, это турнир, который я хотел бы попробовать моделировать).Реализация нескольких активных ассоциаций записей

турнира модель хранит следующую информацию:

  • Имя
  • Banner (только URL к изображению размещенную на сайте)
  • Карта бассейн (коллекция объектов карты, которые используются для турнир)
  • игроков (количество игроков, которые принимают участие в этом турнире)
  • раундов от 32 до финальных (раунд 32, 16, 8, 4, 2)

Это модели, которые я придумал: Турнир, Карта Бассейн, Карта, Игрок, Гонка (т. Protoss Terran или Zerg), Team (то есть, к какой команде принадлежит игрок), Round_of_32, Round_of_16, Round_of_8, Round_of_4, Round_of_2, Group (коллекция совпадений за раунд), Match (коллекция, которая имеет информацию за матч между игроками) и игра (в которой есть карта и победитель). По мере того, как приложение будет развиваться, у меня будет больше и больше турниров, каждый со своим набором данных, хотя игроки могут быть частью нескольких турниров, а карты могут быть частью нескольких карточных пулов для своих соответствующих турниров и т. Д.

  • турнира имеет бассейн карты, которая включает в себя ряд карт
  • турнир имеет несколько игроков, каждый из которых связан с другой расой и командами
  • раунд 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 

я упускаю что-нибудь или использовать что-нибудь неправильно?

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 

ответ

0

Я бы еще сказать, ваши раундов должны быть одной модели. Похоже, что различия между ними являются логическими, а не структурными. Итак, я бы сделал круглый стол и добавил атрибут type (воспользуйтесь однонаправленным наследованием таблицы?).

Будучи поклонником SC, я был бы рад помочь вам смоделировать его, если хотите.

Также: игрок> - гонка? Ты уверен? Я не могу менять гонки между играми или даже турнирами ?!

+0

Прохладный спасибо за отзыв о модели Round. Кроме того, для проблемы с игроком/гонкой вы поднимаете хороший момент. Я просто подумал, что это сделает поиск немного легче (т. Е. Вместо того, чтобы искать всех игроков с типом «RACE», имея таблицу за гонку, может потребовать немного больше работы при смене гонки игрока, но это сделает поиск быстрее) – tanookiben

+0

erm, я не думаю, что вы поняли мое предложение гонки там. Я структурирую это так. 'player> - участвует (а) - TomDunning