2017-04-18 16 views
1

現在、ロードに11秒かかるページがあります。私はBullet Gemを使用して、N + 1クエリーがどこで起こっているかを見つけやすくしています。それは私のいくつかの出力を与えるが、私は本当にそれをどうすればわからない。ここでは弾丸からの出力は次のとおりです。N + 1を停止するための熱心な実装を実装する - Rails

GET /events/1679/dashboard 
USE eager loading detected 
    RSVP => [:tickets] 
    Add to your finder: :includes => [:tickets] 
Call stack 
    /Users/cameronbass/Desktop/Work/blackbird-rsvp/app/decorators/rsvp_decorator.rb:54:in `tickets?' 
    /Users/cameronbass/Desktop/Work/blackbird-rsvp/app/views/accepted_rsvps/_list.html.erb:33:in `block in _app_views_accepted_rsvps__list_html_erb___1211423417683052584_70339569780320' 

そして、ここでは、この行に

def tickets? 
    rsvp.tickets.any? 
end 

それを置くために私に言っていますが団体である:

has_one :ticket 
attendee.rb

has_many :tickets, through: :attendees 

+1

通常、これはそれらのもののリストを繰り返し、それぞれのチケットを呼び出すことを指します。そのコードは表示されていませんが、おそらくあなたは多岐に渡るリストを持っています。 – tadman

+1

あなたのログを見てください! 1回のリクエストでデータベースが何度もヒットしているのを見ると、おそらくN + 1の状況になります。 eager loadingを使用してdbを1回だけヒットし、関連するテーブルを取得してレコードをロードすることができます。 – bkunzi01

+0

このような質問が表示されたら、私はこの回答にリンクする必要があります:http://stackoverflow.com/a/26251892/525478 YMMV –

答えて

3

同じアソシエーションの複数のコールが検出された、熱心な負荷を追加する必要がある場所にのではありません。

どこかあなたはおそらくあなたの出欠をトラバース_list.html.erbテンプレート内(つまり、何でも)、あなたはそれがtickets関連を呼び出すことにより、任意のチケットを持つかどうかを判断しようとしている各RSVP用。あなたがテンプレートにトラバース出欠(おそらくどこかAcceptedRSVPsコントローラ内)のための変数を設定ファインダーにinclude(:tickets)を追加する

弾丸のアドバイス。それが完了すると、各RSVPがチケットを見つけるためにSQLを実行することはないので、N + 1の問題を取り除くことになります。

関連する問題