From 1554786c6ac49b452697d2f7a3e8daf6e3ac36d3 Mon Sep 17 00:00:00 2001
From: Yorick Peterse <yorickpeterse@gmail.com>
Date: Tue, 13 Oct 2015 11:49:01 +0200
Subject: [PATCH] Eager load various issue/note associations

This ensures we don't end up running N+1 queries for the objects in the
affected collections.
---
 app/controllers/projects/issues_controller.rb | 2 +-
 app/models/concerns/issuable.rb               | 7 ++++++-
 app/models/group.rb                           | 2 +-
 app/models/note.rb                            | 1 +
 4 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 4612abcbae8..27aa70a992b 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -57,7 +57,7 @@ class Projects::IssuesController < Projects::ApplicationController
   def show
     @participants = @issue.participants(current_user)
     @note = @project.notes.new(noteable: @issue)
-    @notes = @issue.notes.inc_author.fresh
+    @notes = @issue.notes.inc_associations.fresh
     @noteable = @issue
 
     respond_with(@issue)
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 4db4ffb2e79..0e8bcc1a4ec 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -47,7 +47,8 @@ module Issuable
              prefix: true
 
     attr_mentionable :title, :description
-    participant :author, :assignee, :notes, :mentioned_users
+
+    participant :author, :assignee, :notes_with_associations, :mentioned_users
   end
 
   module ClassMethods
@@ -176,6 +177,10 @@ module Issuable
     self.class.to_s.underscore
   end
 
+  def notes_with_associations
+    notes.includes(:author, :project)
+  end
+
   private
 
   def filter_superceded_votes(votes, notes)
diff --git a/app/models/group.rb b/app/models/group.rb
index 9cd146bb73b..465c22d23ac 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -64,7 +64,7 @@ class Group < Namespace
   end
 
   def owners
-    @owners ||= group_members.owners.map(&:user)
+    @owners ||= group_members.owners.includes(:user).map(&:user)
   end
 
   def add_users(user_ids, access_level, current_user = nil)
diff --git a/app/models/note.rb b/app/models/note.rb
index ee0c14598f3..3ad9895a935 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -59,6 +59,7 @@ class Note < ActiveRecord::Base
   scope :fresh, ->{ order(created_at: :asc, id: :asc) }
   scope :inc_author_project, ->{ includes(:project, :author) }
   scope :inc_author, ->{ includes(:author) }
+  scope :inc_associations, ->{ includes(:author, :noteable, :updated_by) }
 
   serialize :st_diff
   before_create :set_diff, if: ->(n) { n.line_code.present? }
-- 
GitLab