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 :throughs?

Другими словами, что-то вроде этого (в 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 Ассоциация уже делает это.

Другие вопросы по тегам