在ActiveRecord, has_many :through, and Polymorphic Associations中,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
的{{1}}值现在都由Rails存储为Person
(Rails为此寻找基类SentientBeing
值)。
在grouper_type
中修改has_many
以在这种情况下按类型过滤的正确方法是什么?我希望能够Widget
和Widget.find(n).people
,但目前这两种方法(Widget.find(n).aliens
和.people
)都会返回空集{{ 1}}因为.aliens
始终是[]
。
答案 0 :(得分:13)
您是否尝试过最简单的事情 - 将:conditions
添加到has_many :through
?
换句话说,就像这样(在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
关联已经在做了。