Объекты и отношения в Ruby on Rails - PullRequest
0 голосов
/ 28 июня 2009

Я пытаюсь создать простое веб-приложение для какой-то личной разработки, но я столкнулся с препятствием, которое, я надеюсь, другие найдут тривиальным. У меня созданы рабочие классы, но я не уверен, как определить их отношения или их модели даже подходят.

Ради аргумента, у меня уже есть следующие классы: Пользователь, Команда, и Спортсмен

Функциональность, к которой я стремлюсь, заключается в том, чтобы пользователь создал команду, добавив одного спортсмена к объекту команды. Другие пользователи могут либо добавить игроков в команду, либо они могут добавить альтернативы существующему спортсмену в списке команды. По сути, я хочу создать какой-то класс для переноса массива объектов атлетов, мы назовем его AthleteArray .

Если мое понимание верно, вот отношения, которые были бы уместны:

  1. Итак, Команда будет иметь-много AthleteArrays
  2. AthleteArray будет иметь-много спортсменов и будет принадлежать a Team
  3. Спортсмены будут принадлежать a Пользователю и принадлежат a AthleteArray .
  4. Пользователи будут иметь-много спортсменов, но это будет степень их участия.

Так как класс AthleteArray не будет иметь никаких атрибутов, целесообразно ли создавать его как объект ActiveRecord (будет ли он иметь просто идентификатор)? Есть ли другой способ реализовать эту идею (вы можете определить класс команды, чтобы иметь массив массивов объектов спортсмена)? У меня очень мало знаний о RoR, но я подумал, что было бы неплохо начать с веб-разработки. Любая помощь будет оценена. Заранее спасибо!

Редактировать: имена спортсменов, команд и массивов спортсменов не важны. Предположим, что Атлет - это в основном комментарий, проверенный по списку атлетов. Дублирование приемлемо. Если я понимаю ответы на вопросы, я должен в основном создать промежуточный класс, который берет идентификационные данные своих родителей?

Это ответ Омару: В конце концов, я хотел бы добавить систему голосования. Таким образом, после создания основной команды пользователи могут по отдельности предлагать замены для данного игрока, а пользователи могут голосовать за лучший выбор. Например, если у меня создана команда chess_players:

  1. Бобби Фишер
  2. Гарри Каспаров
  3. Владимир Крамник

кто-то может нажать на Каспарова и решить, что лучшим атлетом будет Deep Blue, поэтому этот вариант будет казаться вложенным при Каспарове, пока он не получит больше голосов. Этот же процесс будет происходить для каждого персонажа, но в отличие от системы комментариев, вы не сможете ответить на «Deep Blue» и заменить другого игрока, вы просто ответите на позицию № 2 и предложите другого игрока.

Ответы [ 2 ]

1 голос
/ 28 июня 2009

Правильно, поэтому, если я правильно понимаю вопрос, будет много возможных комбинаций спортсменов для команды, которая может или не может использовать одни и те же спортсмены?

Здесь что-то звучит не так, возможно, в именах ваших моделей. Не совсем нравится запах AthleteArrays.

has_many_through может быть то, что вам нужно, чтобы получить доступ к спортсменам из вашей команды, например,

has_many :athletes, :through => :team_permuations # your AthleteArray model

У Джоша Сассера есть давняя сводка о множестве ассоциаций, и я думаю, это то, что вам нужно, поскольку в соответствии с вашей спецификацией спортсмен может иметь теоретическую принадлежность к любому количеству команд. Полагаю, лучше всего то, что у вас могут быть автоматически заполненные столбцы аудита (созданный / updated_at / on) для многих из многих ассоциаций, что приятно иметь.

http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off

Пожалуйста, прокомментируйте, если вы считаете, что я неправильно понял вопрос.

1 голос
/ 28 июня 2009

Если я понимаю вашу потребность, это то, что можно решить с помощью has_many: through.

в принципе вы можете представить это в базе данных как

athletes:
  id
  other_fields

teams:
  id
  other_fields

roster_items:
  id
  team_id
  athlete_id
  position
  is_active #is currently on the team or just a suggestion
  adding_user_id #the user who added this roster item

class Athlete < ActiveRecord::Base
  has_many :roster_items
end

class Team < ActiveRecord::Base
  has_many :roster_items
  has_many :athletes, :through => :roster_items
end

class RosterItem < ActiveRecord::Base
  belongs_to :team
  belongs_to :athlete
  belongs_to :adding_user, :class_name => 'User'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...