6

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

我已经看到了 eager_custom.rb 文件,它现在似乎不适用于 Rails。看起来 Rails 现在确实以不同的方式进行预加载,使用 2 个查询(常规查询加上一个查询,其中 'id IN' 来自第一个查询的 id),而不是过去使用的单连接查询。

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

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

谢谢

4

1 回答 1

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's:include选项的格式相同),以及 (3 ) 一个选项哈希。有关更多详细信息,请参阅 ActiveRecord::AssociationPreload::ClassMethods 模块的文档。

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

于 2009-12-17T22:09:25.323 回答