структура базы данных для приложения Лиги
Первый пост на SO so я приношу извинения, если я не следую рекомендациям правильно.
Я разрабатываю приложение для управления онлайн-лигой в Rails и столкнулся с некоторыми проблемами в дизайне базы данных, которые я предпочел бы решить сейчас, чем идти вперед с тем, что у меня есть, и выяснить, что это не будет работать позже.
В настоящее время у меня есть следующие модели:
class League < ActiveRecord::Base
has_many :teams
has_many :players
end
class Team < ActiveRecord::Base
belongs_to :league
has_many :players
end
class Player < ActiveRecord::Base
belongs_to :league
belongs_to :team
end
Идея состоит в том, что лига может быть либо составлена из команд игроков, либо просто отдельных игроков без команды. команда. В настоящее время у меня есть атрибут league_type в таблице лиг, который определяет, является ли лига для команд или игроков. Мой первый вопрос заключается в том, является ли это хорошим способом справиться с этой ситуацией?
Одна из причин, по которой это кажется проблемой, заключается в том, что я пытаюсь создать матч, потому что он будет состоять либо из игроков, либо из команд. Первоначально я думал, что у меня будет модель соответствия с атрибутами home_id и away_id, а затем заполнить их либо player_ids или team_ids в зависимости от типа лиги, однако это не кажется мне хорошим дизайном. Я рассматривал возможность сделать поля дома и вдали полиморфными, возможно, это лучший способ? Напр..
class Match < ActiveRecord::Base
belongs_to :home_matchable, polymoprhic: true
belongs_to :away_matchable, polymoprhic: true
end
А затем добавить "has_many :home_matches, as: home_matchable" и "has_many :away_matches, as: away_matchable" для команд и игроков.
Я нахожу, что просто с ограниченным количеством просмотров и контроллеров, которые у меня есть на данный момент, мне, кажется, нужно регулярно проверять, является ли лига для команд или игроков, так что есть много" if league_type == 'teams' do something else do something else " заявления в моем коде, который чувствует себя немного уродливо. Особенно если в конце пути я решу, что хочу добавить тип "двойников", например, чтобы они превратились в "если " команды", то еще, если "игроки", то еще " и т. д.
Извините, что это оказалось намного дольше, чем я ожидал, любая помощь очень ценится!
1 ответ:
Почему бы не заставить игрока быть в команде по умолчанию? При создании игрока в БД вы автоматически создадите для него команду и сделаете его единственным участником.
Вы также можете пометить эти команды булевым символом, сообщающим вам, что это не многопользовательские команды.
Таким образом, вы будете иметь дело только с командами при создании матчей. Мне лично не нравится полиморфный подход, он может стать сложным для манипулирования различными моделями при доступе к вашим ассоциациям.