Rails 4 について。 最近、開発環境に bullet gem をインストールして、アプリの N+1 クエリをクリアしました。関連モデル:
投稿: カテゴリとユーザーに属します。多くの SubmissionDetail があります。
ユーザー:多くの提出物があります
カテゴリ:多数の投稿があります。アワード所属。
アワード:多くのカテゴリがあります (およびカテゴリを介した提出)
SubmissionDetails: Submissionsに属します
投稿のインデックス ページにはeach do
、現在のユーザーが行った各投稿を表示するステートメントがあります。
<% current_user.submissions.order('created_at DESC').in_groups_of(3, false) do |group| %>
<div class="row">
<% group.each do |submission| %>
その後、関連するカテゴリ、賞、提出物の詳細情報など、提出物に関する情報を一覧表示します。Bullet は、このステートメントに N+1 の問題があると言っています。
N+1 Query detected Submission => [:category] Add to your finder: :include => [:category]
N+1 Query detected Submission => [:user] Add to your finder: :include => [:user]
N+1 Query detected Submission => [:submission_details] Add to your finder: :include => [:submission_details]
これら 3 つのモデルすべてを追加しようとするたびに.includes
、最初にリストしたモデルのみが選択されます (これは驚くべきことではありません)。複数のモデルが関係している場合は、別のルートに進む必要があると思います-おそらく結合ステートメントですか?
(最初の項目を :category にすると、この通知が追加されます):
N+1 Query detected Category => [:award] Add to your finder: :include => [:award]
(そのため、ステートメントの一部として、Award をそこに適合させる方法も含める必要があります。これには、カテゴリを通じて多くの提出物があります)。
では、3 つの異なるモデルに対して1 つを実行できないと仮定すると.includes
、別の方法はありますか? ありがとう。