From 08551c018103be3ef1eec253d1695458338a7893 Mon Sep 17 00:00:00 2001 From: MAEDA Go Date: Fri, 21 Aug 2026 09:28:05 +0900 Subject: [PATCH 1/3] Preload the associations rendered by the issues API (N+1) --- app/controllers/issues_controller.rb | 4 +++- app/models/issue_query.rb | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index b0ba4bb90..9ae4d4393 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -58,8 +58,10 @@ class IssuesController < ApplicationController format.api do @offset, @limit = api_offset_and_limit @query.column_names = %w(author) + preload = [:tracker, :assigned_to, :category, :fixed_version, :custom_values] + preload << {:attachments => :author} if include_in_api_response?('attachments') @issue_count = @query.issue_count - @issues = @query.issues(:offset => @offset, :limit => @limit) + @issues = @query.issues(:offset => @offset, :limit => @limit, :preload => preload) Issue.load_visible_relations(@issues) if include_in_api_response?('relations') if User.current.allowed_to?(:view_time_entries, nil, :global => true) Issue.load_visible_spent_hours(@issues) diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index 3431750f6..8e4458666 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -402,7 +402,8 @@ class IssueQuery < Query end # Returns the issues - # Valid options are :order, :offset, :limit, :include, :conditions + # Valid options are :order, :offset, :limit, :conditions, + # :include, and :preload def issues(options={}) order_option = [group_by_sort_order, (options[:order] || sort_clause)].flatten.reject(&:blank?) # The default order of IssueQuery is issues.id DESC(by IssueQuery#default_sort_criteria) @@ -424,6 +425,9 @@ class IssueQuery < Query [:tracker, :author, :assigned_to, :fixed_version, :category, :attachments] & columns.map(&:name) ) + if options[:preload] + scope = scope.preload(options[:preload]) + end if has_custom_field_column? scope = scope.preload(:custom_values) end -- 2.55.0