ActiveRecord,has_many:through和Polymorphic Associations

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

伙计们,

想确保我正确理解这一点。请忽略此处继承的情况(SentientBeing),试图将注意力集中在has_many中的多态模型上:通过关系。这就是说,考虑以下...

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.people << my_person

但是,当我这样做时,我注意到'grouper'的'type'在widget_groupings中始终为空。但是,如果我对以下内容进行了类似的处理:

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

然后,所有的作品都如我通常所料。我不认为我曾经见过这种非多态关联发生,只是想知道这是否是特定于这个用例的东西,或者如果我潜在地盯着一个错误。

提问于
用户回答回答于

Rails 3.1.1 存在一个已知的问题,它打破了这个功能。如果您遇到此问题,请先尝试升级,但已在3.1.2中修复

你太亲近了。问题是你滥用:source选项。:源应该指向多态的belongs_to关系。然后,您需要做的就是为您想要定义的关系指定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
用户回答回答于

如上所述,由于源代码的错误,这不适用于rails 3.1.1,但它已在Rails 3.1.2中修复

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问6 回答
  • 富有想象力的人

    4 粉丝0 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 发条丶魔灵1

    6 粉丝525 提问4 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励