ruby-on-rails - Rails 5 Way 中的这两个陈述是否相互矛盾?
问题描述
我现在正在阅读“The Rails 5 Way”,并且已经到了涵盖includes
和joins
. 到目前为止,我的理解includes
是最适合将 DB 数据预先加载到内存中以避免 N+1 查询,同时joins
更适合基于关联表对查询结果集进行简单过滤,而无需实际访问这些关联表行的属性:
1
include(*associations) Active Record 能够消除“N+1”查询,方法是让您使用查找器中的
includes
方法或选项指定要预先加载的关联。Active Record 将以尽可能少的查询来加载这些关系。
2
joins(expression)
joins
的工作方式类似于在结果 SQL 查询中包含使用 INNER JOIN。了解内部联接的关键知识之一是它们仅返回与正在联接的表匹配的记录集。如果联接任一侧的行缺少另一侧的相应行,则结果集中都不会返回。
但是,在第 202 页上,我看到以下内容:
3
到目前为止,该
joins
方法最常见的用法是在单个 SELECT 语句中为关联对象预取数据,以防止所谓的 N+1 查询。
引用 #3 中描述的用法似乎更适合引用 #1 而不是引用 #2,即它讨论了通过急切加载数据来减少 N+1 查询的目标(我知道通过includes
调用引擎盖)。老实说,引用#3 似乎根本不匹配#1。 eager_load
preload
我的问题是——我们如何才能调和这 3 个报价?或者它们是否已经相互同步,而我只是错过了一些东西?
解决方案
推荐阅读
- swift - 如何将此 api 中的所有数据获取到 UITableView 中的 UILabels 中?
- python - 如何在 Python 中清除屏幕?
- google-chrome - 是否可以在 Google Chrome 开发者工具中更改标尺线的颜色?
- mongodb - 按时间、日期和月份对 mongodb 聚合进行排序
- android - 是否有可能使用 Reader SDK 以编程方式更改 Square 键?
- javascript - 根据数据属性设置cookie
- triggers - Zabbix 3.4.15 发现触发器:如何在触发器名称中添加发现参数{#SERIAL}?
- excel - 根据某些特定字符提取字符串
- ios - 如何在 Apple Connect 中获取 ProductID?(应用内购买)
- c# - 我在我的服务总线队列中调用了一个长时间运行的进程。我希望它持续超过 5 分钟