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

Bit*_*ise 2 ruby activerecord ruby-on-rails bullet eager-loading

我目前有一个页面,需要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'
Run Code Online (Sandbox Code Playgroud)

告诉我放在这条线上

def tickets?
  rsvp.tickets.any?
end
Run Code Online (Sandbox Code Playgroud)

这是关联:

has_many :tickets, through: :attendees
Run Code Online (Sandbox Code Playgroud)

Attendee.rb

has_one :ticket
Run Code Online (Sandbox Code Playgroud)

Bor*_*aMa 5

项目符号将您指向检测到同一关联的多个呼叫的位置,而不是您应添加急切加载的位置。

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

Bullet建议您添加include(:tickets) 到查找器中,该查找器将为您在模板中遍历的RSVP(可能在您的AcceptedRSVPs控制器中的某处)设置变量。完成此操作后,将不会为每个RSVP运行SQL查找其票证,因此您将摆脱N + 1问题。