Rails测试出现Bullet::Notification::UnoptimizedQueryError如何修复
问题修复方案
这个错误由性能检测工具Bullet抛出,核心原因是程序加载Inquiry记录后,又单独发起了查询请求获取其关联的partner_application数据,产生了N+1查询问题,可通过以下方案修复:
方案1:修改序列化器的预加载配置(推荐)
你当前的序列化器配置只预加载了inquiry一级关联,没有包含inquiry下嵌套的partner_application关联,直接修改options中的include参数,添加嵌套关联的预加载声明即可:
let(:options) do { include: %i[inquiry inquiry.partner_application company assignee banks] } end
如果你的序列化器不支持符号类型的嵌套关联写法,换成字符串格式即可:
include: ['inquiry', 'inquiry.partner_application', 'company', 'assignee', 'banks']
方案2:在查询InquiryProcess的位置添加预加载
如果你是从数据库查询inquiry_process实例,直接在查询语句中声明嵌套关联的预加载:
# 示例查询语句,可根据你的实际写法调整 inquiry_process = InquiryProcess.includes(inquiry: :partner_application).find(id)
方案3:确认关联必要性(可选)
先检查Inquiry对应的序列化器/业务代码中是否真的用到了partner_application的字段,如果是冗余调用,直接删除该关联的引用即可,不需要额外添加预加载逻辑。
测试环境临时规避方案(不推荐)
如果仅测试场景需要临时跳过该检测,可以在测试用例中临时关闭Bullet的N+1检测:
around do |example| Bullet.enable = false example.run Bullet.enable = true end
内容的提问来源于stack exchange,提问作者Petros Kalafatidis
相关产品推荐
相关产品推荐

