2014-11-01 3 views
0

Я создаю приложение, которое занимается спортивными командами. В настоящее время у меня две модели. Модель User.rb и модель Teams.rb. Внутри пользователей приложения я хотел бы иметь капитанов команд и товарищей по команде. Я хотел бы дать капитану притязания на создание команды, когда они подпишут. Я хотел бы, чтобы капитан принадлежал команде, а товарищи по команде принадлежат команде. Я бы хотел, чтобы у команды был только один капитан. Каким будет лучший способ установить это? Должен ли я иметь капитана и псевдонима товарища по команде в модели пользователей? Или было бы лучше сделать модель captains.rb?Лучший способ создать модель и базу данных

+1

У капитанов и товарищей по команде есть разные атрибуты? –

+0

** Просто предупреждение: соглашение Rails заключается в использовании сингулярных существительных для моделей. 'rails g model Users 'дал бы вам: ** [WARNING] Название модели« Пользователи »было распознано как множественное число, вместо этого использовалось единственное« Пользователь ». Переопределите с помощью -force-множественное число или настройте правила пользовательского перегиба для этого существительного перед запуском генератора. –

ответ

0

Если капитаны и товарищи по команде имеют разные атрибуты, поэтому я думаю, что лучше отделить модели, но если это не так, почему бы вам не создать таблицу соединений для товарищей по команде между пользователями и командой, а модель команды имеет владельца Я бы. Пример

Схема:

Team (owner_id, .....)

Одноклубники (user_id, team_id, ....)

Это поможет вам установить связь между belongs_to Командные и пользовательские модели в качестве Капитана, используя столбец owner_id в командной модели, а остальные члены могут быть сделаны by_many teammates через Teammates Model или даже использовать has_and_belongs_to_many ассоциацию. Таким образом, вы сможете позволить одному пользователю иметь одну команду или даже товарища по команде в других командах.

Еще одна идея, позволяющая всем членам внутри таблицы join с дополнительным столбцом определить свою роль в команде, что даст вам больше контроля, если вы собираетесь добавить больше ролей в будущем и определить свои валидации и совки для этого.

1

Ok, первый позволяет раскладывать предположение отношения, так как есть некоторые, которые являются неточными из описаний:

Пользователя может:

  • В многих капитанами
  • быть на многих командах

команда может:

  • Принадлежит к одному капитану
  • Есть много пользователей, как товарищи по команде

От этого я думаю, вам нужно 3 модели:

  • пользователя
  • Команда
  • Одноклубники, который действует как has_many_through JOIN таблица между пользователями и командами

Модель членов команды, безусловно, есть:

  • user_id
  • team_id
  • Возможная роль/тип поля

И это оставляет точку, где вы должны принять решение о приложении на основе как вы будете использовать данные. Поскольку у команды будет только один капитан, вы можете оставить поле ролей в модели teammate и просто добавить user_id или captain_id в фактическую модель Team. Это означало бы, что капитан всегда считается особым и отличается от других товарищей по команде. Тем не менее, я предполагаю, что вы могли бы пропустить всех членов команды, включая капитана. Вот почему вы, вероятно, должны просто сделать капитана особой ролью в модели teammate и добавить валидацию, чтобы убедиться, что есть только один капитан. Тогда вам не нужно делать особую манипуляцию для капитана всякий раз, когда вы перебираете всю команду.

Предполагая, что вы идете с полем роли тогда ваши окончательные модели будут иметь следующие соотношения:

Teammate

  • belongs_to: команда
  • belongs_to: пользователь

Пользователь

  • has_many: товарищи по команде
  • HAS_MANY: команды, через:: товарищи по команде

Команда

  • has_many: товарищи по команде
  • HAS_MANY: пользователи, с помощью:: товарищи по команде
  • has_one: team_captain, - > {где роль: 'капитан'}, имя_компьютера: 'Teammate'

Вы могли бы также полюбить этот последний, разработав has_many, чтобы добраться до капитана, а не капитана team_mate. Это сообщение имеет некоторые интересные подробности о передовых has_one:

http://www.rojotek.com/blog/2014/05/16/cool-stuff-you-can-do-with-rails-has_one/

0

Я хотел бы сделать следующим образом:

В начале приложение позволяет зарегистрироваться в качестве «пользователя владельца ака команды» или как «товарищ по команде»

  1. Пользователи.rb - могут создавать команды и приглашать других товарищей по команде. Имеет административные права.
  2. Teams.rb - принадлежит Пользователю и имеет много товарищей по команде.
  3. Teammates.rb - принадлежит к командам.
  4. Все назначенные товарищи по команде могут обладать надписью «капитан» с надписью «admin» с булевым значением. Это может спасти вас от создания еще одной таблицы db. Если «капитан» не «истинно», статус товарища по команде «простой игрок». В противном случае это «капитан».

Другой способ - позволить пользователям создавать команды и товарища по команде.

  1. Пользователь has_many Команды и товарища по команде.
  2. Teammate принадлежит_to Пользователю и принадлежит_ команде.
  3. Team принадлежит_to Пользователь и has_many Составы матчей.
Смежные вопросы