From 783868e9faa1e3dff27765f8244dc59898a2f7b2 Mon Sep 17 00:00:00 2001 From: Andreas Brandl Date: Fri, 23 Mar 2018 13:58:46 +0100 Subject: Remove N+1 query for Noteable association. For each event with `Event#target_type` of "Note", we had a query to load the associated instance `noteable`. For example, if `Note` was related to an issue, we'd load each `Issue` with its own query (N+1 problem). Closes #43150. --- app/models/event.rb | 10 +++++----- .../unreleased/ab-43150-users-controller-show-query-limit.yml | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 changelogs/unreleased/ab-43150-users-controller-show-query-limit.yml diff --git a/app/models/event.rb b/app/models/event.rb index 17a198d52c7..3805f6cf857 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -52,12 +52,12 @@ class Event < ActiveRecord::Base belongs_to :target, -> { # If the association for "target" defines an "author" association we want to # eager-load this so Banzai & friends don't end up performing N+1 queries to - # get the authors of notes, issues, etc. - if reflections['events'].active_record.reflect_on_association(:author) - includes(:author) - else - self + # get the authors of notes, issues, etc. (likewise for "noteable"). + incs = %i(author noteable).select do |a| + reflections['events'].active_record.reflect_on_association(a) end + + incs.reduce(self) { |obj, a| obj.includes(a) } }, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations has_one :push_event_payload diff --git a/changelogs/unreleased/ab-43150-users-controller-show-query-limit.yml b/changelogs/unreleased/ab-43150-users-controller-show-query-limit.yml new file mode 100644 index 00000000000..502c1176d2d --- /dev/null +++ b/changelogs/unreleased/ab-43150-users-controller-show-query-limit.yml @@ -0,0 +1,5 @@ +--- +title: Remove N+1 query for Noteable association. +merge_request: 17956 +author: +type: performance -- cgit v1.2.1