Rails соединяют таблицы или ассоциации HABTM - PullRequest
1 голос
/ 28 июля 2010

В приложении, которое я создаю, я хочу иметь События. Затем люди могут зарегистрироваться для участия в мероприятии, создав команду, непосредственно зарегистрировавшись для участия в мероприятии (без команды) или присоединившись к существующей команде. Первоначально я настроил его как Event has_many команды, Team has_many пользователи, пользователь own_to Team и Event. Однако я предвижу проблемы, если зарегистрированный пользователь захочет присоединиться к другому событию (или команде для другого события), а также при попытке перечислить такие вещи, как @ user.events или @ user.teams на панели управления. Кто-то предложил использовать соединительную таблицу и создать модель регистрации / миграции, чтобы присоединиться к ним. Могу ли я иметь модель соединения, которая принадлежит Event, Team и User? Я все это неправильно подхожу?

1 Ответ

2 голосов
/ 28 июля 2010

Вы можете создать регистрацию модели соединения и сделать полиморфную принадлежность 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: owners,: through =>: регистрации, которые рассматриваются вплагины типа has_many_polymorphs .

...