ActiveRecord::Associations::Preloader 只预加载一些关系

ActiveRecord::Associations::Preloader only preloads some of a relation

我正在使用 find_by_sql 然后 ActiveRecord::Associations::Preloader 预加载一些关系。我可以在控制台中看到它正在预加载关系,但由于某种原因它仍然在 as_json 调用期间延迟加载部分关联记录。

在这种特殊情况下,find_by_sql return 编辑了一个包含 1872 个模型的数组。每个模型都应该至少有一个关联的细节模型。我使用以下代码预加载关联

preload = [
  details: %i[account department]
]
ActiveRecord::Associations::Preloader.new.preload(results, preload)

为了检查是否所有关联都已预加载,我使用了以下代码

results.select{|r| r.association(:details).loaded? == false}.length
2
results.find_index{|r| r.association(:details).loaded? == false}
192

我想知道是否出于某种原因,预加载器只会预加载固定数量的记录,但未加载的记录的索引不是彼此相邻的,也不是朝向结果数组的一端。它们的索引分别为 192 和 472。

这是我的 as_json 代码

json = results.as_json(
  include: [
    details: {include: %i[department account]}
  ]
)

为什么它只预加载了一些关系是有原因的。如果我将不同的搜索参数传递给 find_by_sql,它会 return 为更多模型预加载关系,以及更多未预加载的关系。如果我使用 return 少量模型的搜索参数,所有内容都会预加载。

由于 SQL 中的连接条件,我发现结果数组两次包含相同的模型。 Rails 仅为其中一个重复模型预加载关联。