首页 > 解决方案 > Rails 避免了处理外部和内部数据的 N+1 查询问题

问题描述

我有以下来自外部来源的数组:

documents = ['Doc Name 1', 'Doc Name 2', 'Doc Name 3', ...]

我想遍历数组,并在我的数据库(模型Doc)中找到有关文档的详细信息(如果存在)。

documents.each do |document|
  puts Doc.find_by_name(document).details if Doc.find_by_name(document)
end

这段代码当然可以,但是如何避免 N+1 查询问题呢?

标签: ruby-on-rails

解决方案


希望details是表中的一列docs(模型的复数)

试试下面的:

documents = ['Doc Name 1', 'Doc Name 2', 'Doc Name 3']

Doc.where(name: documents).pluck(:details)

它将触发单个查询并仅选择列的值details并返回数组中的详细信息:

SELECT "docs"."details" FROM "docs" 
  WHERE "docs"."name" IN ('Doc Name 1', 'Doc Name 2', 'Doc Name 3')

如果阵列上有更多数据,documents请考虑使用批处理。


推荐阅读