Я пытаюсь настроить модели для своего приложения 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
Прохладный спасибо за отзыв о модели Round. Кроме того, для проблемы с игроком/гонкой вы поднимаете хороший момент. Я просто подумал, что это сделает поиск немного легче (т. Е. Вместо того, чтобы искать всех игроков с типом «RACE», имея таблицу за гонку, может потребовать немного больше работы при смене гонки игрока, но это сделает поиск быстрее) – tanookiben
erm, я не думаю, что вы поняли мое предложение гонки там. Я структурирую это так. 'player> - участвует (а) -
TomDunning