Techioz Blog

Rails 6でネストされたn + 1の問題を解決する方法

概要

4つのモデルを持っています。ジェムバレットを導入しました。多くの機器を含むプロポーザルを入力すると、N+1 の問題アラートが表示されます。提案項目にincludes(:equipment)を入れるよう求められます。表示しますが、N +1 メッセージが常に表示されます。

提案

class Proposal < ApplicationRecord
  belongs_to :client
  has_many :proposal_items, dependent: :destroy
  accepts_nested_attributes_for :proposal_items, reject_if: :all_blank, allow_destroy: true

クライアント

class Client < ApplicationRecord
    has_many :clients
    has_many :proposals

提案事項

class ProposalItem < ApplicationRecord
  belongs_to :proposal
  belongs_to :equipment

装置

class Equipment < ApplicationRecord
  belongs_to :category
  has_many :proposal_items

それを提案コントローラーに入れてみました。

def index
    @proposals = Proposal.includes(:job, :employee, :client, proposal_item: :equipment). 

ただし、それはインデックスメソッドの場合です。 show メソッドに入ると、n +1 アラートが表示されます。

解決方法を知っている人はいますか?

解決策

まず最初に、モデルについて 1 つの提案をしたいと思います。おそらくモデルはすでにお持ちで、スニペットに入れるのを忘れているだけかもしれませんが、次のとおりです。

class Proposal < ApplicationRecord
  belongs_to :client
  has_many :proposal_items, dependent: :destroy
  has_many : Equipment, through: :proposal_items
  accepts_nested_attributes_for :proposal_items, reject_if: :all_blank, allow_destroy: true

これにより、次のことができるようになります。

 @proposals = Proposal.includes(:job, :employee, :client, :proposal_items)

おそらく、問題は解決するはずです。