ActiveRecord,has_many: through 和 Polyformic 关联

各位,

我想确定我没理解错。请忽略这里继承的情况(SentientBeing) ,试图将重点放在 has _ many: through 关系中的多态模型上。也就是说,考虑以下..。

class Widget < ActiveRecord::Base
has_many :widget_groupings


has_many :people, :through => :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'"
has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'"
end


class Person < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end


class Alien < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end


class WidgetGrouping < ActiveRecord::Base
belongs_to :widget
belongs_to :grouper, :polymorphic => true
end

在一个完美的世界中,我希望在给定一个 Widget 和一个 Person 的情况下,执行以下操作:

widget.people << my_person

但是,当我这样做的时候,我注意到在 widget _ groupings 中,‘ grouper’的‘ type’总是 null。但是,如果我这样做:

widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person})

Then all works as I would have normally expected. I don't think I've ever seen this occur with non polymorphic associations and just wanted to know if this was something specific to this use case or if I'm potentially staring at a bug.

谢谢你的帮助!

21596 次浏览

有许多: through 和多态不能一起工作。如果您尝试直接访问它们,它应该抛出一个错误。 如果我没记错的话,你必须手写 widget.people 和 push 例程。

我不认为这是一个 bug,它只是一些还没有实现的东西。我想我们可以在特性中看到它,因为每个人都有可以使用它的案例。

There is a 已知问题 with Rails 3.1.1 that breaks this functionality. If you are having this problem first try upgrading, it's been fixed in 3.1.2

你就快成功了。问题在于您错误地使用了: source 选项。: 源应指多态的归属关系。然后,您需要做的就是为您试图定义的关系指定: source _ type。

这个对 Widget 模型的修复应该允许您完成您正在寻找的工作。

class Widget < ActiveRecord::Base
has_many :widget_groupings


has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person'
has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien'
end

正如上面提到的,由于在: source 上的错误,这不能在 Rails3.1.1中工作,但是在 Rails3.1.2中已经修复了