如何解决Rails 6中嵌套关联的N+1查询问题?
解决Proposal Show页面的N+1查询问题
问题核心是你仅在index方法中做了关联预加载,但show方法查询单个Proposal时未预加载关联的proposal_items和equipment,导致页面渲染时触发大量额外查询。
修复步骤
修改Proposal控制器的show方法
在show方法中添加正确的预加载关联(注意proposal_items是复数,对应模型里的has_many :proposal_items),代码如下:def show @proposal = Proposal.includes(:client, proposal_items: [:equipment]).find(params[:id]) end这段代码会一次性预加载三类数据:
- 当前Proposal关联的Client
- 当前Proposal下所有的ProposalItem
- 每个ProposalItem关联的Equipment
修正Client模型的笔误
你的Client模型中存在错误的递归关联has_many :clients,需删除或替换为符合业务逻辑的关联:class Client < ApplicationRecord # 移除错误的递归关联:has_many :clients has_many :proposals end验证效果
重新访问包含大量Equipment的Proposal详情页,Bullet gem的N+1警告应会消失。所有关联数据已在初始查询时一次性加载完成,遍历ProposalItem时不会再逐个触发Equipment查询。
内容的提问来源于stack exchange,提问作者Vagner
相关产品推荐
相关产品推荐

