ActiveRecord,has_many:through,与STI的多态关联

时间:2011-07-05 11:41:09

标签: ruby-on-rails ruby-on-rails-3

ActiveRecord, has_many :through, and Polymorphic Associations中,OP的示例请求忽略AlienPerson 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_typeAlien的{​​{1}}值现在都由Rails存储为Person (Rails为此寻找基类SentientBeing值)

grouper_type中修改has_many以在这种情况下按类型过滤的正确方法是什么?我希望能够WidgetWidget.find(n).people,但目前这两种方法Widget.find(n).aliens.people都会返回空集{{ 1}}因为.aliens始终是[]

1 个答案:

答案 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关联已经在做了。