2017-04-18 90 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_many :tickets, through: :attendees 

attendee.rb

has_one :ticket 
+1

通常這指的是迭代這些東西的列表,並在每個列表上調用「門票?」。該代碼沒有顯示,但大概你有一個多元列表......無論這些是什麼。 – tadman

+1

看看你的日誌!當你看到數據庫多次被一次請求命中時,你可能有N + 1的情況。您可以使用預先加載來代替只敲一次數據庫來獲取關聯的表,然後加載記錄。 – bkunzi01

+0

當我看到這樣的問題時,我覺得有必要鏈接到這個答案:http://stackoverflow.com/a/26251892/525478。因人而異 –

回答

3

子彈點你到檢測到同一關聯的多個電話而不是的地方,您應該添加熱切加載的地方。

_list.html.erb模板中的某處可能會遍歷RSVP(無論是什麼),並且對於每個RSVP,您試圖通過調用tickets關聯來確定它是否有任何故障單。您在模板遍歷

子彈建議你include(:tickets)添加到其設置爲回函變量取景器(可能在某處你AcceptedRSVPs控制器)。一旦完成,每個RSVP都不會有SQL運行來查找它的票據,因此您將擺脫N + 1問題。