首页 > 解决方案 > Rails 5 Way 中的这两个陈述是否相互矛盾?

问题描述

我现在正在阅读“The Rails 5 Way”,并且已经到了涵盖includesjoins. 到目前为止,我的理解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_loadpreload

我的问题是——我们如何才能调和这 3 个报价?或者它们是否已经相互同步,而我只是错过了一些东西?

标签: ruby-on-railsjoinrails-activerecord

解决方案


推荐阅读