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

Implement eager loading to stop N+1 - Rails

我目前有一个页面需要 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

Bullet 将您指向它检测到同一关联的多个调用 的地方, 指向您应该添加 eager 的地方加载。

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

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