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

推荐答案

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

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

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

Ruby-on-rails相关问答推荐

Rails 7:加载所有刺激控制器

从 rails 5 迁移到 rails 6

Rails 4 强参数:允许所有属性?

错误“未初始化的常量 AWS (NameError)”

Heroku:不能运行超过 1 个免费大小的测功机

活动模型序列化程序中的条件属性

在 Ruby 中拆分多行的长字符串而不去除换行符

Rails 5,#

Rails,Docker:主机不存在:“默认”

Redis 引发“需要 NOAUTH 身份验证”错误,但没有设置密码

Rails - 按连接表数据排序

Rails 与多个外键的关联

ActiveRecord::StatementInvalid: PG InFailedSqlTransaction

xxx 的副本已从模块树中删除,但仍处于活动状态

参数错误:范围主体需要可调用

在rails 4中没有计数的复数

ActiveRecord::Base:Class 的未定义方法 raise_in_transactional_callbacks=' (NoMethodError)

无法连接 localhost:3000 ruby​​ on rails in vagrant

PG::UndefinedTable: 错误:在使用连接时缺少表的 FROM 子句条目以及在哪里

使用 Capybara,如何切换到带有“_blank”目标的链接的新窗口?