实施急切加载以停止N + 1 - Rails

时间:2017-04-18 18:25:02

标签: ruby-on-rails ruby activerecord eager-loading bullet

我目前有一个需要11秒才能加载的页面。我使用Bullet Gem来帮助我找到N + 1查询发生的位置。它给了我一些输出,但我真的不知道如何处理它。这是Bullet的输出:

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 个答案:

答案 0 :(得分:4)

项目符号指向您检测到同一关联的多个电话的地方,到您应该添加预先加载的地方。

_list.html.erb模板中的某个位置,您可能会遍历您的RSVP(无论是什么),并且对于每个RSVP,您都试图通过调用tickets关联来确定它是否有任何票证。

Bullet建议您将include(:tickets) 添加到查找器中,该查找器为您在模板中遍历的RSVP (可能位于您的AcceptedRSVPs控制器中的某个位置)设置变量。一旦完成,就不会为每个RSVP运行SQL运行以找出它的票据,因此你将摆脱N + 1问题。