2017-04-18 92 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问题。