Rails 不支持在includes
. 你知道,这只是lazy load
。
它使用ActiveRecord::Associations::Preloader模块在数据实际使用之前加载关联数据。通过方法:
def preload(records, associations, preload_scope = nil)
records = Array.wrap(records).compact
if records.empty?
[]
else
records.uniq!
Array.wrap(associations).flat_map { |association|
preloaders_on association, records, preload_scope
}
end
end
preload_scope
, 的第三个参数preload
是一种选择指定列的方法。但是不能再懒加载了。
在 Rails 5.1.6
relation = Profile.where(id: [1,2,3])
user_columns = {:select=>[:updated_at, :id, :name]}
preloader = ActiveRecord::Associations::Preloader.new
preloader.preload(relation, :user, user_columns)
它将选择您传入的指定列。但是,它仅用于单个关联。您需要创建一个补丁ActiveRecord::Associations::Preloader
来支持一次加载多个复杂的关联。
这是补丁的示例
使用方法,例子