渴望在子类上加载关联

时间:2010-01-27 19:56:29

标签: ruby-on-rails eager-loading

我有以下(简化)类层次结构:

def Parent < ActiveRecord::Base end
def Child < Parent
  belongs_to :other
end
def Other < ActiveRecord::Base end

我想获取所有Parent对象 - 如果它们是Child对象 - 让他们急切地加载:其他关联。所以我希望我能做到:

Parent.find(:all, :include => [:other])

但是,正如我所担心的那样,我收到的消息是:“未找到名为'其他'的协会;也许你拼错了它?”

在这种情况下建立预先加载的最佳方式是什么?

[编辑] 根据要求,这是更具体的例子:

  • Parent = Event
  • Child = PostEvent
  • 其他=发布

我想记录不同类型的事件,所有事件都有自己的属性(其中一些是对其他对象的引用),如上例所示。同时我希望能够列出发生的所有事件,因此列出父类。

2 个答案:

答案 0 :(得分:2)

您可以在belongs_to :other模型中定义Parent关联吗?它与每个Parent对象无关,但这是STI的本质:您几乎总是会有某些列,并不是每个孩子都使用过。

如果您确实无法将关联移动到父级,则可能必须分两步加载,例如:

Parent.find(:all, :conditions => "type != 'Child'") +
  Child.find(:all, :include => [:other])

答案 1 :(得分:1)

由于Child继承自Parent(而非其他方式),Parent不了解belongs_to :other关联。

我认为您需要重新考虑如何为应用建模。也许你的实际模型的某些细节会为你想要完成的事情的替代方法提出一些答案。