如何为Rails Association :: Preloader设置预加载范围?

时间:2015-04-17 09:24:40

标签: ruby-on-rails activerecord preloader

我需要预先加载模型与复杂条件的关联。不,includes对我不起作用。它为我的任务生成了错误的SQL。

我看一下ActiveRecord::Associations::Preloader并发现他采用preload_scope论证:

http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/Preloader/preload

 def preload(records, associations, preload_scope = nil)
  # ...
 end

但我找不到任何使用它的例子。在这种情况下,preload_scope是什么?我如何使用它来过滤关联? 谢谢!

1 个答案:

答案 0 :(得分:2)

ActiveRecord不会通过关联#preloads公开此信息: https://github.com/rails/rails/blob/0aefa97689d001ca9a98db76bbad1bbbb0e51c9c/activerecord/lib/active_record/relation.rb#L663 - 正如您所看到的,只传递记录和关联参数。

您可以访问ActiveRecord内部并直接调用Preloader:

rows = Projects.all.to_a
ActiveRecord::Associations::Preloader.new.preload(rows, :current_task, Struct.new(:values, :bind_values).new({where: "active"}, []))