Rails添加自定义的预先加载

时间:2009-12-17 21:32:28

标签: ruby-on-rails activerecord eager-loading

我在Rails中有许多自定义的find_by_sql查询。我想用它们急切加载,但似乎没有一个好的方法来做到这一点。

我已经看到eager_custom.rb文件浮动,现在似乎不适用于Rails。现在看来Rails确实急于加载,使用2个查询(常规查询加上查询,其中'id IN'来自第一个查询的ID),而不是过去使用的单个连接查询。

我的问题是,如果我执行自定义SQL查询,然后执行'id IN'查询,有没有办法将关联对象添加回初始查询结果?

例如,我有使用find_by_sql加载的主题,然后我找到主题ID在主题ID中的主题图像,有没有办法手动将图像添加回主题?

由于

1 个答案:

答案 0 :(得分:10)

正如您所注意到的,在Rails 2.1中引入了一种新的预先加载/预加载,它使用id IN (...)的多个查询。此方法通常更快,尤其是在预加载多个关联时。通过使用从ActiveRecord继承的find_by_sql类方法(不推荐),您可以使用preload_associations手动使用此功能。例如:

class Person
  def self.find_a_special_group
    people = find_by_sql("...")
    preload_associations(people, [:jobs, :addresses])
    return people
  end
end

preload_associations方法受到保护,因此您必须从类中调用它,它需要(1)一个对象数组,(2)一个数组,哈希或关联符号(格式与find的{​​{1}}选项),以及(3)选项哈希。有关更多详细信息,请参阅ActiveRecord :: AssociationPreload :: ClassMethods模块的文档。

然而,尽管如此,这种技术肯定是不可取的,因为Rails文档不鼓励程序员直接使用:include。您确定必须使用preload_associations吗?您确定知道find_by_sql所有选项吗? (find:select:from:joins:group等)我不是说你不需要:having,而是可能值得花几分钟确定。