From 9052d4d05bb76c8ac6bf9c94a7a0289f78611e5d Mon Sep 17 00:00:00 2001 From: Go MAEDA Date: Sun, 27 Apr 2025 08:27:08 +0000 Subject: [PATCH] Optimize watchers list rendering by eager loading email addresses (#42589). Patch by Go MAEDA (user:maeda). git-svn-id: https://svn.redmine.org/redmine/trunk@23722 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/helpers/watchers_helper.rb | 4 +++- app/models/principal.rb | 2 ++ app/models/user.rb | 1 - 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb index 6e6366846..bfed8adf2 100644 --- a/app/helpers/watchers_helper.rb +++ b/app/helpers/watchers_helper.rb @@ -48,7 +48,9 @@ module WatchersHelper def watchers_list(object) remove_allowed = User.current.allowed_to?(:"delete_#{object.class.name.underscore}_watchers", object.project) content = ''.html_safe - lis = object.watcher_users.sorted.collect do |user| + scope = object.watcher_users + scope = scope.includes(:email_address) if Setting.gravatar_enabled? + lis = scope.sorted.collect do |user| s = ''.html_safe s << avatar(user, :size => "16").to_s if user.is_a?(User) s << link_to_principal(user, class: user.class.to_s.downcase) diff --git a/app/models/principal.rb b/app/models/principal.rb index 77f599c73..86c4edb84 100644 --- a/app/models/principal.rb +++ b/app/models/principal.rb @@ -35,6 +35,8 @@ class Principal < ApplicationRecord :foreign_key => 'user_id' has_many :projects, :through => :memberships has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify + # Always returns nil for groups + has_one :email_address, lambda {where :is_default => true}, :autosave => true, :foreign_key => 'user_id' validate :validate_status diff --git a/app/models/user.rb b/app/models/user.rb index 51ebf25f6..4b6387ae5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -91,7 +91,6 @@ class User < Principal has_one :preference, :dependent => :destroy, :class_name => 'UserPreference' has_one :atom_token, lambda {where "#{table.name}.action='feeds'"}, :class_name => 'Token' has_one :api_token, lambda {where "#{table.name}.action='api'"}, :class_name => 'Token' - has_one :email_address, lambda {where :is_default => true}, :autosave => true has_many :email_addresses, :dependent => :delete_all belongs_to :auth_source