ActiveRecord, has_many :through, Polymorphic Associations with STI
In ActiveRecord, has_many :through, and Polymorphic Associations, the OP's example requests ignoring the possible superclass of Alien
and Person
(SentientBeing
). This is where my question lies.
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
In this modified example the grouper_type
value for Alien
and Person
are now both stored by Rails as SentientBeing
(Rails seeks out the base class for this grouper_type
value).
What is th开发者_开发知识库e proper way to modify the has_many
's in Widget
to filter by type in such a case? I want to be able to do Widget.find(n).people
and Widget.find(n).aliens
, but currently both of these methods (.people
and .aliens
) return empty set []
because grouper_type
is always SentientBeing
.
Have you tried the simplest thing - adding :conditions
to the has_many :through
s?
In other words, something like this (in 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 is correct that a join is needed - but it's not written out here, since the has_many :through
association is already doing it.
精彩评论