структура базы данных для приложения Лиги


Первый пост на 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 2

1 ответ:

Почему бы не заставить игрока быть в команде по умолчанию? При создании игрока в БД вы автоматически создадите для него команду и сделаете его единственным участником.

Вы также можете пометить эти команды булевым символом, сообщающим вам, что это не многопользовательские команды.

Таким образом, вы будете иметь дело только с командами при создании матчей. Мне лично не нравится полиморфный подход, он может стать сложным для манипулирования различными моделями при доступе к вашим ассоциациям.