Стратегии моделирования для Ruby on Rails - PullRequest
1 голос
/ 01 марта 2011

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

На верхнем уровне у нас есть геймеры.Геймеры могут иметь много событий.События имеют много участников (которые являются геймерами).

В событии может быть любое количество участников, и это меня отталкивает.Если бы это было определенное количество Участников, я мог бы просто иметь их в виде столбцов внутри модели Events с внешним ключом для Gamers, но я не уверен, как настроить ассоциации для этого.

Мои тесты настроили их так:

rails gen.модель Gamer ..rails gen model Event ..rails gen model Участники .. событие: ссылки

Так что теперь ...

Событие has_many: участникиУчастникамне совсем подходит для моего примера ...

Gamer has_many: event_participants,: through =>: events

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Я бы подошел к этому с некоторыми изменениями именования отношений и таблицей соединений:

class Gamer
    has_many :hosted_events, :class_name => 'Event', :foreign_key => :host_id
    has_and_belongs_to_many :events
end

class Event
    belongs_to :host, :class_name => 'Gamer'
    has_and_belongs_to_many :gamers
end

А в вашей БД вам понадобится таблица соединений events_gamers с event_id и gamer_id столбцы.Никакой модели, хотя - Rails позаботится обо всем за кадром.

Вам действительно нужны только две модели.Если отношение «геймер G участвовал в событии E» не требует дополнительных данных (скажем, «и принес фишки!») - тогда это будет оправдывать свою собственную модель (я бы назвал это «Участие - участник немного вводит в заблуждение»)и отношения has_and_belongs_to_many станут has many :through с.

Надеюсь, это поможет!

1 голос
/ 01 марта 2011

Я бы использовал Single-Inheritance и действовал бы так:

1.Добавьте столбец 'type' в таблицу участников

2.Создайте модель Gamer и сделайте так, чтобы она наследовала от модели Участника.(Наследование)

3. Определите атрибуты игрока в таблице участников.

4.Настройте ваши модели, как показано ниже:

class Event < ActiveRecord::Base
  has_many :registrations
  has_many :participants, :through => :registrations
end

class Participant < ActiveRecord::Base
  has_many :registrations
  has_many :events, :through => :registrations
end

class Gamer < Participant
end

class Registration < ActiveRecord::Base
  belongs_to :event
  belongs_to :participant
end

Так что теперь вы можете сделать

gamer = Gamer.first #just an instance
gamer.events
event = Event.first #just an instance
all_participants = event.participants
gamers = event.gamers
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...