我很难找到ActiveRecord对象的includes()和preload()的比较.有人能解释这两者的区别吗?

推荐答案

Rails有两种避免n+1问题的方法.一个涉及创建一个基于连接的大型查询来获取关联,另一个涉及对每个关联进行单独的查询.

当你做includes次时,rails会决定使用哪种策略.它默认为单独的查询方法(预加载),除非它认为您正在使用条件或顺序中的关联中的列.因为这只适用于连接方法,所以它使用了连接方法.

Rails的启发法有时会出错,或者您可能有特定的原因 Select 一种方法而不是另一种.preload(及其配套方法eager_load)允许您指定希望rails使用的策略.

Ruby-on-rails相关问答推荐

错误AESGCMOpen获取密码:消息身份验证失败:Golang解密GCM

多行与内联块之间的不同行为

Ruby on Rails/Activerecord 排序自引用查询?

为 has_attached_file 等活动记录属性创建类方法

Rails ActiveRecord 中的更新插入

Rails 和 jsonb 类型jsonb不存在

Rails 将字符串与视图中的变量连接的最佳方法

如何使用默认的 Rails 记录器记录 Ruby 异常的整个回溯?

使用 Devise 令牌登录,这是内置的吗?

如何使用失败try 次数使设计可锁定

简单表单关联自定义标签名称

在 Rails 中将 DateTime 字符串转换为 UTC

如何在不删除项目本身的情况下删除单个 HABTM 关联项目?

Rspec/Capybara 正在加载,循环要求被认为是有害的

连接表的最佳 SQL 索引

保存后重定向到索引而不是显示

如何在 Ruby on Rails 的内存缓存存储中列出键?

Test::Unit Rails - 如何断言一个数字大于另一个?

rake 任务中的 def 块

没有UTC的Rails 3默认日期时间格式