Skip to content

Commit ac423bb

Browse files
committed
fix: eager load permissions and organisers in DashboardController
Motivation: Bullet was reporting N+1 queries on the homepage (/). The view accesses event.organisers which requires the permissions join table to be eager loaded. Analysis: - The all_events method loads Event and Workshop objects that need organisers and permissions preloaded - Also fixed Meeting eager loading to include permissions - Changed from includes() to eager_load() to handle nested through-associations (organisers goes through permissions) Before: N+1 queries per event for organisers After: Single query with JOIN on permissions table.
1 parent 0f6cc31 commit ac423bb

1 file changed

Lines changed: 10 additions & 8 deletions

File tree

app/controllers/dashboard_controller.rb

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ def top_coach_query
5757
end
5858

5959
def upcoming_events
60-
workshops = Workshop.upcoming.includes(:chapter, :sponsors, :organisers)
60+
workshops = Workshop.eager_load(:chapter, :sponsors, :organisers, :permissions)
61+
.upcoming
6162
.limit(MAX_WORKSHOP_QUERY)
63+
.to_a
6264
sorted_events = all_events(workshops).sort_by(&:date_and_time)
6365

6466
limited_events = []
@@ -77,20 +79,19 @@ def upcoming_events
7779
end
7880

7981
def total_upcoming_events_count
80-
workshops = Workshop.upcoming.includes(:chapter, :sponsors, :organisers)
81-
all_events(workshops).count
82+
workshops = Workshop.eager_load(:chapter, :sponsors, :organisers, :permissions)
83+
all_events(workshops.to_a).count
8284
end
8385

8486
def upcoming_events_for_user
85-
chapter_workshops = Workshop.upcoming
87+
chapter_workshops = Workshop.eager_load(:chapter, :sponsors, :organisers, :permissions)
8688
.where(chapter: current_user.chapters)
87-
.includes(:chapter, :sponsors, :organisers)
8889
.to_a
8990

9091
accepted_workshops = current_user.workshop_invitations.accepted
9192
.joins(:workshop)
9293
.merge(Workshop.upcoming)
93-
.includes(workshop: %i[chapter sponsors organisers])
94+
.eager_load(workshop: %i[chapter sponsors organisers permissions])
9495
.map(&:workshop)
9596

9697
all_events(chapter_workshops + accepted_workshops)
@@ -99,8 +100,9 @@ def upcoming_events_for_user
99100
end
100101

101102
def all_events(workshops)
102-
meeting = Meeting.includes(:venue, :organisers).next
103-
events = Event.includes(:venue, :sponsors, :organisers).upcoming.take(DEFAULT_UPCOMING_EVENTS)
103+
meeting = Meeting.eager_load(:venue, :organisers, :permissions).next
104+
events = Event.eager_load(:venue, :sponsors, :sponsorships, :permissions,
105+
:organisers).upcoming.take(DEFAULT_UPCOMING_EVENTS)
104106

105107
[*workshops, *events, meeting].uniq.compact
106108
end

0 commit comments

Comments
 (0)