1

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

Он должен работать что-то вроде этого:

< событий ActiveRecord :: Base
    has_many: admin_users,: через =>: event_users,: источник =>: userable,: source_type => ' Пользователь»
    has_many: participating_users,: через =>: event_users,: источник =>: userable,: source_type => 'Пользователь'
    has_many: paid_users,: через =>: event_users,: источник => : UserA BLE,: source_type => 'Пользователь'
    has_many: done_users,: через =>: event_users,: источник =>: userable,: source_type => 'User'
конец

класс EventUser < ActiveRecord :: База
    belongs_to: userable,: полиморфный => верно
    belongs_to: событие
конец

Пользователь < ActiveRecord :: Bas
    has_many: event_users, а: =>: userable
    has_many: события,: через =>: event_users
конец

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

ответ

0

Боюсь, что ваши ассоциации выглядят совершенно неправильно. Прежде всего, если у вас есть «has_many» с одной стороны ассоциации, у вас должно быть a 'принадлежит_to' на другой стороне. Во-вторых, я предполагаю, что done_user, admin_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. Вот отличный скринкаст на named_scopes.

+0

Извините, я новичок в рельсах (но мне это нравится!). Все модели * _user находятся здесь, чтобы сообщить модель события, если пользователь заплатил, или если он/она закончил отчет или если он/она является администратором мероприятия.Таким образом, в основном они абсолютно одинаковы и просто сообщают модели событий о конкретном пользователе. – jonepatr

+0

Теперь я скорректировал модели так, что они почти правильны, за исключением того, что userable_type установлен для пользователя, а не для участия в нем – jonepatr

+0

. Но если я использую named_scopes, то рельсы автоматически создают правильное условие для меня, когда я использую вложенные формы? – jonepatr

Смежные вопросы