Rails, has_many полиморфная ассоциация с одной моделью - PullRequest
1 голос
/ 07 ноября 2010

Я бы хотел, чтобы одна модель (событие) имела несколько полиморфных ассоциаций HABTM с одной и той же моделью пользователя.

Это должно работать примерно так:

Событие has_many: admin_users,: through =>: event_users,: source =>: userable,: source_type => 'User'
has_many: Participing_users,: through =>: event_users,: source =>: userable,: source_type => 'Пользователь'
has_many: paid_users,: through =>: event_users,: source =>: userable,: source_type => 'User'
has_many: done_users,: through =>: event_users,: source =>: userable,: source_type => 'User'
end

Класс EventUser assign_to: userable,: polymorphic => true
принадлежат: событие
конец

Пользователь has_many: event_users,: as =>: полезный
has_many: events,: through =>: event_users
end

Это почти работает !! Проблема заключается в том, что userable_type получает тип «Пользователь» для всех различных ассоциаций. Можно ли это решить?

1 Ответ

0 голосов
/ 07 ноября 2010

Боюсь, ваши ассоциации выглядят совершенно неправильно.Прежде всего, если у вас есть «has_many» на одной стороне ассоциации, , у вас должно быть a «own_to» на другой стороне.Во-вторых, я предполагаю, что done_user, admin_user и т. Д. Наследуют от пользователя.Правильно ли я?

И чем отличаются участвующий_пользователь, администратор_пользователь и т. Д. Друг от друга?Вам действительно нужны классы для каждого из них, вы можете обойтись с именованными областями?Я бы предложил вам упростить модель данных.Прямо сейчас твое моделирование выглядит нечетким.Пожалуйста, уточните.

EDIT

Честно говоря, я думаю, что ваше моделирование слишком сложное.Если бы я был вами, учитывая ваши описания * _users, я бы просто назвал области, чтобы получить этот тип пользователя.Так что в действительности

class Event < ActiveRecord::Base
  has_many :event_users
  has_many :users, :through => :event_users
end

class User < ActiveRecord::Base
  has_many :event_users
  has_many :events, :through => :event_users
end

Итак, напишите именованные области в вашей модели User, чтобы получить * _user.Вот отличный скринкаст на named_scopes .

...