ActiveRecord, has_many:through, полиморфные ассоциации с ИППП
В ActiveRecord, has_many:through и Полиморфные ассоциации пример OP запрашивает игнорирование возможного суперкласса Alien
а также Person
( SentientBeing
) Вот где лежит мой вопрос.
class Widget < ActiveRecord::Base
has_many :widget_groupings
has_many :people, :through => :widget_groupings, :source => :person, :source_type => 'Person'
has_many :aliens, :through => :widget_groupings, :source => :alien, :source_type => 'Alien'
end
SentientBeing < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end
class Person < SentientBeing
end
class Alien < SentientBeing
end
В этом модифицированном примере grouper_type
значение для Alien
а также Person
теперь оба хранятся в Rails как SentientBeing
(Rails ищет базовый класс для этого grouper_type
значение).
Как правильно изменить has_many
в Widget
фильтровать по типу в таком случае? Я хочу быть в состоянии сделать Widget.find(n).people
а также Widget.find(n).aliens
, но в настоящее время оба эти метода ( .people
а также .aliens
) вернуть пустой набор []
так как grouper_type
всегда SentientBeing
,
1 ответ
Вы пробовали самую простую вещь - добавление :conditions
к has_many :through
s?
Другими словами, что-то вроде этого (в widget.rb):
has_many :people, :through => :widget_groupings, :conditions => { :type => 'Person' }, :source => :grouper, :source_type => 'SentientBeing'
has_many :aliens, :through => :widget_groupings, :conditions => { :type => 'Alien' }, :source => :grouper, :source_type => 'SentientBeing'
JamesDS правильно, что объединение необходимо - но это не написано здесь, так как has_many :through
Ассоциация уже делает это.