正如您所注意到的,在 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, 但可能值得花几分钟来确定。