2017-04-18 8 views
1

Ich habe zZ eine Seite, die 11 Sekunden dauert, um zu laden. Ich benutze den Bullet Gem, um mir zu helfen, herauszufinden, wo die N + 1-Abfrage stattfindet. Es gibt ein bisschen Leistung, aber ich weiß wirklich nicht, was ich damit anfangen soll. Hier ist die Ausgabe von Einschuss:Implementieren Sie eifriges Laden, um N + 1 zu stoppen - Schienen

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' 

Und es sagt mir, es auf dieser Linie zu setzen

def tickets? 
    rsvp.tickets.any? 
end 

Hier ist der Verein:

has_many :tickets, through: :attendees 

attendee.rb

has_one :ticket 
+1

Normalerweise bezieht sich das auf etwas, das über eine Liste dieser Dinge iteriert und 'tickets? 'Auf jedem einzelnen aufruft. Dieser Code wird nicht gezeigt, aber vermutlich haben Sie eine Liste von multipleple ... was auch immer diese sind. – tadman

+1

Schau dir deine Logs an! Wenn Sie feststellen, dass die Datenbank mehrmals für eine Anforderung betroffen ist, haben Sie wahrscheinlich eine N + 1-Situation. Sie können das Eager-Laden verwenden, um die Datenbank nur einmal zu treffen, um die zugehörige Tabelle zu erfassen und dann die Datensätze zu laden. – bkunzi01

+0

Wenn ich Fragen wie diese sehe, fühle ich mich verpflichtet, auf diese Antwort zu verlinken: http://stackoverflow.com/a/26251892/525478. YMMV –

Antwort

3

Bullet verweist Sie auf die Ort, wo es mehrere Anrufe der gleichen Vereinigung, nicht entdeckt zu dem Ort, wo Sie eifrig laden hinzufügen sollte.

Irgendwo in der _list.html.erb Vorlage durchlaufen Sie wahrscheinlich Ihre RSVPs (was auch immer das ist) und für jedes RSVP versuchen Sie festzustellen, ob es ein Ticket hat oder nicht, indem Sie die tickets Assoziation aufrufen.

Einschuss berät Sie include(:tickets)an den Finder hinzuzufügen, die für RSVPs die Variable einrichtet (wahrscheinlich irgendwo in Ihrem AcceptedRSVPs Controller), die Sie in der Vorlage durchqueren. Sobald dies erledigt ist, wird es keinen SQL-Lauf mehr für jedes RSVP geben, um seine Tickets zu finden und somit werden Sie das N + 1-Problem los.

Verwandte Themen