From 1f1ef6a03c9392531c16ebc393d00b426b9d51e0 Mon Sep 17 00:00:00 2001 From: Morgan Roderick Date: Tue, 23 Jun 2026 09:25:38 +0200 Subject: [PATCH] fix: eager load organisers on workshops, events, and meetings to eliminate N+1 queries Bullet detected N+1 queries on Workshop#organisers and Event#organisers when rendering the events list. Also removed unused permissions eager loading on Meeting queries, kept venue (used in the view), and added organisers to fix its N+1. Meeting analysis: - venue: used in _event.html.haml line 18-20 (all 51 meetings have venue_id in production), kept - permissions: not directly accessed in view; includes(:permissions) doesn't reduce organisers queries (they fire their own SQL join regardless), dropped - organisers: accessed in view line 32-34, was causing N+1, added --- app/controllers/events_controller.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 5880f08ca..2c3f3e61c 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -73,13 +73,13 @@ def set_event def fetch_upcoming_events events = [ - Workshop.includes(:chapter, :sponsors, :host, :permissions) + Workshop.includes(:chapter, :sponsors, :host, :permissions, :organisers) .upcoming .joins(:chapter) .merge(Chapter.active) ] - events << Meeting.upcoming.includes(:venue, :permissions).all - events << Event.upcoming.includes(:venue, :sponsors, :sponsorships, :permissions).all + events << Meeting.upcoming.includes(:venue, :organisers).all + events << Event.upcoming.includes(:venue, :sponsors, :sponsorships, :permissions, :organisers).all sorted = events.compact.flatten.sort_by(&:date_and_time) return [{}, nil] if sorted.empty? @@ -95,13 +95,13 @@ def fetch_upcoming_events def fetch_past_events events = [ - Workshop.includes(:chapter, :sponsors, :host, :permissions) + Workshop.includes(:chapter, :sponsors, :host, :permissions, :organisers) .past .joins(:chapter) .merge(Chapter.active) ] - events << Meeting.past.includes(:venue, :permissions).all - events << Event.past.includes(:venue, :sponsors, :sponsorships, :permissions).all + events << Meeting.past.includes(:venue, :organisers).all + events << Event.past.includes(:venue, :sponsors, :sponsorships, :permissions, :organisers).all sorted = events.compact.flatten.sort_by(&:date_and_time).reverse return [{}, nil] if sorted.empty?