Объединяющие таблицы направляющих или ассоциации HABTM

В приложении я создаю, я хочу иметь События. Люди могут затем зарегистрироваться для события путем создания команды путем прямой регистрации для события (никакая команда), или путем присоединения к существующей команде. Я первоначально настроил его как Событие has_many команды, Команда has_many пользователи, пользователь belongs_to Команда и Событие. Однако я предвижу проблемы, если зарегистрированный пользователь хочет присоединиться к другому событию (или команда для другого события), и также при попытке перечислить вещи как @user.events или @user.teams в панели управления. Кто-то предложил использовать объединяющую таблицу и создать модель/миграцию Registration для присоединения к ним. У меня может быть модель соединения, которая принадлежит Событию, Команде и Пользователю? Я приближаюсь к этому неправильно?

1
задан Brad Herman 28 July 2010 в 03:31
поделиться

1 ответ

Вы можете создать регистрацию модели соединения и сделать полиморфный объект own_to, чтобы он мог ссылаться на любой тип объекта. Вот пример:

models / team.rb:

class Team < ActiveRecord::Base
  has_many :registrations, :as => :owner
end

models / user.rb

class User < ActiveRecord::Base
  has_many :registrations, :as => :owner
end

models / registration.rb

class Registration < ActiveRecord::Base
  belongs_to :owner, :polymorphic => true
end

models / event.rb

class Event < ActiveRecord::Base
  has_many :registrations
end

db / migrations / 1234_add_registrations.rb

...
t.belongs_to :owner, :polymorphic => true
t.belongs_to :event
...

Теперь вы можете посмотреть регистрации, чтобы узнать, кто подписался на ваше мероприятие. Вы можете использовать has_many: events,: through =>: registrations,: source =>: owner, чтобы вернуться к пользователям, но обратите внимание, что есть некоторые ограничения, такие как has_many: owner,: through =>: registrations, которые рассматриваются в плагины вроде has_many_polymorphs .

2
ответ дан 2 September 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: