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

推荐答案

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

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

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

Ruby-on-rails相关问答推荐

具有 IN 子句的参数化查询在 ruby​​-on-rails 的 blazer 工具中无法按预期工作

Rails 7,Hotwire 动态表单,更新值不起作用

为什么有时会出现类型错误没有将 StringIO 隐式转换为 String?Ruby /导轨

Rspec期望()与期望{}

Gem::Ext::BuildError:ERROR:无法在macOS Monterey上构建Gem本机扩展

验证模型属性大于另一个

rails 3,简单数组的Kaminari分页

骨干model.destroy()即使工作正常也会调用错误回调函数?

如何使用 Capistrano gem 为生产数据库 seeder ?

Rails ActiveRecord:验证单个属性

添加自定义字段/列以使用 Rails 4 进行设计

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

我可以将默认值传递给 rails 生成迁移吗?

我们如何在 Rails Mailer 中设置邮箱发件人的名称?

如何测试自定义验证器?

通过 Ruby 或 Rails 的 LDAP

has - many :通过 class - name 和 foreign - key

如何在两个字段上对 ruby​​/rails 进行排序?

如何为 Rails 迁移定义布尔字段

为什么 Mac OS X 带有 ruby​​/rails?