Rails 4 热切负载限制子查询

2024-04-03

有没有办法避免急切加载时的 n+1 问题并对子查询应用限制? 我想避免大量这样的 sql 查询:

Category.all.each do |category|
  category.posts.limit(10)
end

但我也希望每个类别只获取 10 个帖子,因此获取所有帖子的标准急切加载是不够的:

Category.includes(:posts).all

解决这个问题的最佳方法是什么? N+1 是限制每个类别帖子数量的唯一方法吗?


来自Rails 文档 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Eager+loading+of+associations

如果您急切加载具有指定 :limit 选项的关联,它将被忽略,返回所有关联的对象

因此给出以下模型定义

class Category < ActiveRecord::Base
  has_many :posts
  has_many :included_posts, -> { limit 10 }, class_name: "Post"
end

Calling Category.find(1).included_posts将按预期工作并在查询中应用 10 的限制。但是,如果你尝试这样做Category.includes(:included_posts).all the limit选项将被忽略。如果您查看一下急切加载生成的 SQL,您就会明白为什么会出现这种情况

Category.includes(:posts).all

Category Load (0.2ms)  SELECT "categories".* FROM "categories"
Post Load (0.4ms)  SELECT "posts".* FROM "posts" WHERE "posts"."category_id" IN (1, 2, 3)

如果您添加了LIMITposts 查询的子句,它将返回一个total共 10 个帖子和not如您所料,每个类别有 10 个帖子。

回到你的问题,我会急切地加载所有帖子,然后使用限制加载的集合first(10)

categories = Category.includes(:posts).all
categories.first.posts.first(10)

尽管您将更多模型加载到内存中,但这必然会提高性能,因为您只对数据库进行了 2 次调用,而调用次数为 n+1 次。干杯。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 4 热切负载限制子查询 的相关文章

随机推荐

  • 可变结构与类?

    我不确定是否使用可变结构或可变类 我的程序存储一个包含很多对象的数组 我注意到使用类会使所需的内存量增加一倍 但是 我希望对象是可变的 并且有人告诉我使用可变结构是邪恶的 这就是我的类型 struct or class Block publ
  • 将 Flash (AS3) 数据保存为 XML

    我在互联网上 包括 Stack Overflow 花了好几个小时 试图找到一个可靠的 可行的示例 将 Flash 中的信息保存到 XML 文件中 我想获取两种不同类型对象的位置并将每个对象的列表导出到 XML 我们将调用这些对象ball a
  • PHP 5.3.3 中的 ini_set("memory_limit") 根本不起作用

    我之前有过这样的工作 echo ini get memory limit n ini set memory limit 256M echo ini get memory limit n 这将输入 32M 256M 在通过命令行执行的 php
  • 如何在 C# HttpClient 中循环调用分页 URL 以从 JSON 结果下载所有页面

    我的第一个问题 所以请友善 我正在使用C HttpClient调用作业 API 端点 这是端点 Jobs API Endpoint 不需要密钥 点击即可 http service dice com api rest jobsearch v1
  • 如何延迟连接流?

    我正在尝试实现一个在其实现中使用其自身的另一个实例的流 该流前面有一些常量元素 使用 IntStream concat 因此只要串联流惰性地创建非常量部分 这应该就可以工作 我认为使用StreamSupport intStream 重载采用
  • 使用 ThreadPool Python 时的最大池大小

    我正在使用 ThreadPool 来实现多处理 使用多处理时 池大小限制应等于 CPU 核心数 我的问题 使用 ThreadPool 时 池大小限制应该是 CPU 核心数吗 这是我的代码 from multiprocessing pool
  • 外键为空 - 性能下降

    我有一个表文件夹 其中列parent id 引用id 如果该文件夹有父级 如果没有 则parent id 为空 这是好的解决方案还是我需要额外的表来进行此连接或其他解决方案 外键是否可以为空 如果可以 这个解决方案将有更长的执行时间 tab
  • 无法访问 Axios 拦截器内的 Vuex 存储突变

    EDIT 这个问题非常混乱 所以我基本上用相同的代码示例和相同的场景重写它 当服务器发送 401 错误响应时 我试图 commit从拦截器到我的 vuex 存储 import axios from axios import store fr
  • 用于查看特定端口的命令行

    有没有办法从 Windows 命令行检查特定端口的状态 我知道我可以使用 netstat 检查所有端口 但 netstat 很慢 并且查看特定端口可能不会 这里是简单的解决方案端口查找 In cmd netstat na find 8080
  • 在 Visual Studio 2015 中哪里可以找到 Microsoft.TeamFoundation.Build.Client?

    我有一个干净的 Windows 安装 仅安装了 Visual Studio 2015 并且我正在寻找 Microsoft TeamFoundation Build Client 程序集 我想知道它现在是否已随着即将推出的 vNext Bui
  • 如何将Python数据类转换为字符串文字字典?

    给定一个如下所示的数据类 class MessageHeader BaseModel message id uuid UUID def dict self kwargs return json loads self json 我想在调用时获
  • 每个进程的最大线程数 - sysconf(_SC_THREAD_THREADS_MAX) 失败

    我试图找到 UNIX 机器上每个进程的最大线程数 并编写下面的代码来使用 sysconf include
  • 如何追踪“libc++abi.dylib:调用了纯虚函数!”在Xcode中

    我有一个混合使用 C Objective C 和 Swift 的多线程 OS X 应用程序 当我的应用程序关闭时 我在 Xcode 调试器窗口中看到以下内容 libc abi dylib Pure virtual function call
  • python/pandas/一维数据框

    创建二维数据框效果很好 y np array 1 2 3 4 df pd DataFrame y index 1 2 columns a b print df 但是如果我尝试创建一维数据框 我会收到一条错误消息 z np array 5 6
  • 如何检查ngIf是否生效

    我在做什么我有一个隐藏 显示的组件 ngIf基于简单的布尔值 当组件变得可见时 我想将焦点应用于其模板中的子元素 问题如果我翻转布尔值 组件会正确显示 但如果我尝试使用以下命令获取对子元素的引用this elRef nativeElemen
  • 为什么“plain_dictionary”编码的字典页偏移量为 0?

    parquet由Spark v2 4 Parquet mr v1 10生成 n 10000 x 1 0 2 0 3 0 4 0 5 0 5 0 None n y u u u u u a None u a n z np random rand
  • Github 和 heroku 上的应用程序:忽略其中一个上的文件,但不忽略另一个上的文件

    我有一个应用程序 其代码位于 github 上 但托管在 heroku 上 我在 Github 上有一个我不想要的配置文件 但在 heroku 上我需要 有人有聪明的解决方案吗 Use 配置变量 http devcenter heroku
  • pandas 系列中列表的高效串联

    我有以下系列 s pd Series a b c d f g gt gt gt s 0 a b 1 c d 2 f g dtype object 连接系列中所有列表的最简单的方法 最好是矢量化的方法 是什么 以便我得到 l a b c d
  • 如何使用 Prolog 查找二叉树的深度

    我正在学习 Prolog 并试图找到一个深度二叉树使用 Prolog 我代表一棵树是这样的 nil is a tree tree 1 nil nil this is a leaf tree 1 tree 1 nil nil nil this
  • Rails 4 热切负载限制子查询

    有没有办法避免急切加载时的 n 1 问题并对子查询应用限制 我想避免大量这样的 sql 查询 Category all each do category category posts limit 10 end 但我也希望每个类别只获取 10