我现在正在阅读“ The Rails 5 Way”,并且已经到达涵盖includes
和joins
的部分。到目前为止,我的理解是includes
最适合于急切地将数据库数据加载到内存中以避免N + 1个查询,而joins
更适合于对查询进行简单过滤基于关联表的结果集,而无需实际访问那些关联表行上的属性:
1
包含(*关联) Active Record可以消除 通过让您指定需要加载的关联来进行“ N + 1”查询 在您的查找器中使用
includes
方法或选项。活动记录 将以最少数量的查询加载这些关系 可能。
2
joins(表达式)
joins
的工作方式与使用INNER的方式类似 在结果SQL查询中加入。知识的关键点之一 了解内部联接是因为它们仅返回记录集 与要连接的表匹配。如果在 联接在另一侧缺少其对应的行,也不会 返回结果集中。
但是,在第202页,我看到以下内容:
3
到目前为止,
joins
方法最常见的用法是热切获取 单个SELECT语句中关联对象的数据,以便 防止所谓的N + 1查询。
引号#3中描述的用法似乎比引号#2更适合引号#1,即它谈到了通过急于加载数据来减少N + 1查询的目标(我知道{{1 }}可以通过调用includes
或eager_load
来实现)。老实说,报价#3似乎根本不匹配#1。
我的问题是-我们如何才能使这3个引号相互协调?还是他们已经彼此同步,而我只是想念一些东西?