Rails 6+Mongoid环境下Book类调用eager_load报错求助
问题解决:Mongoid下无法使用
eager_load进行预加载 问题原因
eager_load是Rails ActiveRecord(关系型数据库ORM)的专属方法,而你使用的Mongoid是MongoDB的ORM,并不兼容这个API,因此调用时会抛出NoMethodError。
正确的预加载方式
Mongoid提供了自身的预加载方法,可解决N+1查询导致的超时问题:
使用
includes方法,这是Mongoid中最常用的预加载方式,会批量加载指定关联数据:Book.includes(:user)该方法会先查询所有符合条件的
Book,再批量查询对应的User,避免循环查询每个Book关联时产生的大量数据库请求。如果需要强制预加载关联(即使后续代码未访问该关联),可使用
preload方法:Book.preload(:user)不过大多数场景下
includes已足够满足需求,它会根据实际使用情况智能选择预加载策略。
验证方法
在Rails控制台执行以下命令,确认预加载生效:
# 执行预加载查询 books = Book.includes(:user).all # 访问第一个Book的User,不会触发额外查询 books.first.user
此时控制台不会输出新的数据库查询语句,说明预加载已完成。
内容的提问来源于stack exchange,提问作者Merouane Amqor
相关产品推荐
相关产品推荐

