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)
おそらく、問題は解決するはずです。