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

How to set preload scope for Rails Associations::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 是什么?我如何使用它来过滤关联? 谢谢!

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"}, []))