Skip to content

Comments

fix: eager load organisers on homepage events#2498

Merged
mroderick merged 1 commit intocodebar:masterfrom
mroderick:fix/homepage-n-plus-one-eager-loading
Feb 21, 2026
Merged

fix: eager load organisers on homepage events#2498
mroderick merged 1 commit intocodebar:masterfrom
mroderick:fix/homepage-n-plus-one-eager-loading

Conversation

@mroderick
Copy link
Collaborator

@mroderick mroderick commented Feb 20, 2026

Summary

  • Add eager loading for :organisers association on Workshop, Meeting, and Event queries in DashboardController#upcoming_events and upcoming_events_for_user

Analysis

The homepage (DashboardController#show) was causing N+1 queries when rendering events because:

  1. Workshops - Query included :chapter and :sponsors but not :organisers
  2. Meetings - Query only included :venue
  3. Events - Query included :venue and :sponsors but not :organisers

When rendering _event.html.haml, the view accesses event.organisers which triggered a separate database query for each event.

Fix

Added :organisers to the .includes() calls for all three event types:

workshops = Workshop.upcoming.includes(:chapter, :sponsors, :organisers)
meeting = Meeting.includes(:venue, :organisers).next
events = Event.includes(:venue, :sponsors, :organisers).upcoming.take(...)

Verification

SQL proof: With :organisers included, ActiveRecord generates a single query with LEFT OUTER JOINs to fetch permissions and members:

LEFT OUTER JOIN "permissions" ON "permissions"."resource_type" = 'Workshop' 
  AND "permissions"."resource_id" = "workshops"."id"
LEFT OUTER JOIN "members_permissions" ON "members_permissions"."permission_id" = "permissions"."id"
LEFT OUTER JOIN "members" ON "members"."id" = "members_permissions"."member_id" 
  AND "permissions"."name" = 'organiser'

Why tests don't fail: The test factories create workshops without individual organiser permissions (only chapter-level), so N+1 doesn't trigger in tests. The N+1 would appear in production when workshops/events have specific organiser permissions.

Testing in production:

  1. Enable query logging in development
  2. Visit the homepage
  3. Look for "Permission Load" queries - with the fix, they should NOT appear inside the event iteration loop

Add missing :organisers include to Workshop, Meeting, and Event queries
in DashboardController#upcoming_events to prevent N+1 queries when
rendering the homepage.
@mroderick mroderick force-pushed the fix/homepage-n-plus-one-eager-loading branch from 80f6696 to 2c76d4b Compare February 20, 2026 21:55
@mroderick mroderick marked this pull request as ready for review February 20, 2026 22:10
Copy link
Contributor

@KimberleyCook KimberleyCook left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉

@mroderick mroderick merged commit 6906388 into codebar:master Feb 21, 2026
8 checks passed
@mroderick mroderick deleted the fix/homepage-n-plus-one-eager-loading branch February 21, 2026 07:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants