ruby-on-rails - 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 查询问题呢?
解决方案
希望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
请考虑使用批处理。
推荐阅读
- django - Boto3/S3/Django:在计算文件哈希时避免阻塞事件循环
- swift - 动画角色的命中测试——获取正确的世界坐标
- android - 片段颜色——如何设置为透明?
- c# - 有没有办法在 Unity 中进行自动化 UI 测试?
- ffmpeg - FFMPEG:Youtube 流媒体质量和速度问题
- python - 解码字符串(UTF?)
- cassandra - Cassandra 失败的格式值
- java - 为什么我在无限循环代码中有不同的结果
- angularjs - Ag-grid 主详细信息防止详细信息行在数据刷新时关闭
- android - 构建项目上的 java.lang.ArrayIndexOutOfBoundsException