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