渴望在Rails 2中加载与不同has_one关联的多态关联

时间:2010-06-20 05:25:32

标签: ruby-on-rails ruby activerecord

当您尝试急切加载不存在的关联时,ActiveRecord会给您一个有趣的错误。它看起来像这样:

ActiveRecord::ConfigurationError: Association named 'secondary_complaint' was not found; perhaps you misspelled it?

现在为什么有人想要预先加载一个不存在的关联?看看这个。

class Bitchy < ActiveRecord::Base
  has_one :primary_complaint, :as => :whiny_bitch, :class_name => 'Complaint', :conditions => {:complaint_type => 'primary'}
  has_one :secondary_complaint, :as => :whiny_bitch, :class_name => 'Complaint', :conditions => {:complaint_type => 'secondary'}

  has_one :life, :as => :humanoid
end


class Whiny < ActiveRecord::Base
  has_one :primary_complaint, :as => :whiny_bitch, :class_name => 'Complaint', :conditions => {:complaint_type => 'primary'}

  has_one :life, :as => :humanoid
end

class Complaint < ActiveRecord::Base
  belongs_to :whiny_bitch, :polymorphic => true
end

class Life < ActiveRecord::Base
  belongs_to :humanoid, :polymorphic => true
end

# And here's the eager-loading part:
Life.all(:include => {:humanoid => [:primary_complaint, :secondary_complaint]})

上面的代码有一些有趣的特点。如果您只有Bitchy作为人形生物 - 它实际上会起作用。但是,只要出现一个Whiny,您就会遇到麻烦。 ActiveRecord开始抱怨我上面写的错误 - 找不到名为'secondary_complaint'的关联。你明白为什么,对吗?因为不是每个人形机器人都有secondary_complaint。

当我试图加载多态关联时,是否有办法让ActiveRecord停止婊子和抱怨,这些关联可能会或可能不会附加某些has_one关联?

1 个答案:

答案 0 :(得分:0)

我知道这可能仅仅是为了您的示例,但您可以将其更改为has_many :complaints,以便它们具有相同的关联,然后从中拉出主要或次要类型。