SQL 包含连接 | 将关联记录加载到内存中 | 执行两个查询 | |
---|---|---|---|
预加载 | 不 | 是的 | 是的 |
包括 | 是(左外连接) | 是的 | 有时 |
急切负载 | (左外连接) | 是的 | 不 |
我从概念中知道了。
我想知道什么时候使用哪个API。我搜索但没有找到确切的答案。
includes
选择是否使用 preload
或 eager_load
。如果您对 includes
做出的决定不满意,则必须诉诸使用 eager_load
或 preload
来自 https://engineering.gusto.com/a-visual-guide-to-using-includes-in-rails/:
:includes什么时候使用:preload?
在大多数情况下 :includes 将默认使用方法 :preload ,这将触发 2 个查询:
:includes什么时候使用:eager_load?
:includes 将默认使用 :preload ,除非您引用在后续子句中加载的关联,例如 :where 或 :order。以这种方式构建查询时,您还需要显式引用急切加载的模型。
Employee.includes(:forms).where('forms.kind = "health"').references(:forms)
所有这些方法都有助于远离 N+1 查询问题,它们之间的关键区别在于你想要如何查询: