From 3cb37748e917919e00ad3b28486c4ba9adb4d5c7 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Sun, 28 Jun 2026 10:52:54 +0300 Subject: [PATCH] optimize select --- app/controllers/api/submissions_controller.rb | 24 +++++++++++++++---- .../submissions_archived_controller.rb | 13 ++++++++-- .../submissions_dashboard_controller.rb | 13 ++++++++-- .../template_folders_controller.rb | 4 ++-- .../templates_archived_controller.rb | 4 ++-- ...mplates_archived_submissions_controller.rb | 2 +- app/controllers/templates_controller.rb | 2 +- .../templates_dashboard_controller.rb | 5 ++-- .../templates_shared_controller.rb | 4 ++-- app/models/submission.rb | 5 ++++ app/models/template.rb | 2 ++ 11 files changed, 60 insertions(+), 18 deletions(-) diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb index edd769df..565b4eeb 100644 --- a/app/controllers/api/submissions_controller.rb +++ b/app/controllers/api/submissions_controller.rb @@ -2,6 +2,10 @@ module Api class SubmissionsController < ApiBaseController + SUBMISSION_COLUMNS = %i[id name slug source submitters_order expire_at created_at updated_at + archived_at variables template_id template_submitters created_by_user_id].freeze + TEMPLATE_COLUMNS = %i[id name external_id created_at updated_at folder_id submitters].freeze + load_and_authorize_resource :template, only: :create load_and_authorize_resource :submission, only: %i[show index destroy] @@ -13,10 +17,22 @@ module Api submissions = Submissions.search(current_user, @submissions, params[:q]) submissions = filter_submissions(submissions, params) - submissions = paginate(submissions.preload(:created_by_user, :submitters, - template: { folder: :parent_folder }, - combined_document_attachment: :blob, - audit_trail_attachment: :blob)) + with_fields = params[:include].to_s.include?('fields') + + submissions = paginate( + submissions.select(with_fields ? SUBMISSION_COLUMNS + %i[template_fields] : SUBMISSION_COLUMNS) + .preload(:created_by_user, :submitters, combined_document_attachment: :blob, + audit_trail_attachment: :blob) + ) + + ActiveRecord::Associations::Preloader.new( + records: submissions, + associations: :template, + scope: Template.select(with_fields ? TEMPLATE_COLUMNS + %i[fields] : TEMPLATE_COLUMNS) + ).call + + ActiveRecord::Associations::Preloader.new(records: submissions.filter_map(&:template), + associations: { folder: :parent_folder }).call expires_at = Accounts.link_expires_at(current_account) diff --git a/app/controllers/submissions_archived_controller.rb b/app/controllers/submissions_archived_controller.rb index 793da755..662e0950 100644 --- a/app/controllers/submissions_archived_controller.rb +++ b/app/controllers/submissions_archived_controller.rb @@ -7,7 +7,7 @@ class SubmissionsArchivedController < ApplicationController @submissions = @submissions.left_joins(:template) @submissions = @submissions.where.not(archived_at: nil) .or(@submissions.where.not(templates: { archived_at: nil })) - .preload(:template_accesses, :created_by_user, template: :author) + .preload(:template_accesses, :created_by_user) @submissions = Submissions.search(current_user, @submissions, params[:q], search_template: true) @submissions = Submissions::Filter.call(@submissions, current_user, params) @@ -18,6 +18,15 @@ class SubmissionsArchivedController < ApplicationController @submissions.order(id: :desc) end - @pagy, @submissions = pagy_auto(@submissions.preload(submitters: :start_form_submission_events)) + @pagy, @submissions = pagy_auto(@submissions.select_for_list.preload(submitters: :start_form_submission_events)) + + template_scope = @submissions.all?(&:template_submitters) ? Template.select_for_list : nil + + ActiveRecord::Associations::Preloader.new(records: @submissions, + associations: :template, + scope: template_scope).call + + ActiveRecord::Associations::Preloader.new(records: @submissions.filter_map(&:template), + associations: :author).call end end diff --git a/app/controllers/submissions_dashboard_controller.rb b/app/controllers/submissions_dashboard_controller.rb index f0851741..f04e9bea 100644 --- a/app/controllers/submissions_dashboard_controller.rb +++ b/app/controllers/submissions_dashboard_controller.rb @@ -8,7 +8,7 @@ class SubmissionsDashboardController < ApplicationController @submissions = @submissions.where(archived_at: nil) .where(templates: { archived_at: nil }) - .preload(:template_accesses, :created_by_user, template: :author) + .preload(:template_accesses, :created_by_user) @submissions = Submissions.search(current_user, @submissions, params[:q], search_template: true) @submissions = Submissions::Filter.call(@submissions, current_user, params) @@ -19,6 +19,15 @@ class SubmissionsDashboardController < ApplicationController @submissions.order(id: :desc) end - @pagy, @submissions = pagy_auto(@submissions.preload(submitters: :start_form_submission_events)) + @pagy, @submissions = pagy_auto(@submissions.select_for_list.preload(submitters: :start_form_submission_events)) + + template_scope = @submissions.all?(&:template_submitters) ? Template.select_for_list : nil + + ActiveRecord::Associations::Preloader.new(records: @submissions, + associations: :template, + scope: template_scope).call + + ActiveRecord::Associations::Preloader.new(records: @submissions.filter_map(&:template), + associations: :author).call end end diff --git a/app/controllers/template_folders_controller.rb b/app/controllers/template_folders_controller.rb index 0a369a5b..a315b167 100644 --- a/app/controllers/template_folders_controller.rb +++ b/app/controllers/template_folders_controller.rb @@ -30,7 +30,7 @@ class TemplateFoldersController < ApplicationController (@template_folders.size < 7 ? 9 : 6) end - @pagy, @templates = pagy_auto(@templates, limit:) + @pagy, @templates = pagy_auto(@templates.select_for_list, limit:) if params[:q].present? && @templates.blank? @related_submissions_pagy, @related_submissions = load_related_submissions(@template_folder) @@ -82,6 +82,6 @@ class TemplateFoldersController < ApplicationController related_submissions = Submissions.search(current_user, related_submissions, params[:q]) .order(id: :desc) - pagy_auto(related_submissions, limit: 5) + pagy_auto(related_submissions.select_for_list, limit: 5) end end diff --git a/app/controllers/templates_archived_controller.rb b/app/controllers/templates_archived_controller.rb index ac05e6f3..84d40074 100644 --- a/app/controllers/templates_archived_controller.rb +++ b/app/controllers/templates_archived_controller.rb @@ -10,7 +10,7 @@ class TemplatesArchivedController < ApplicationController @templates = Templates.search(current_user, @templates, params[:q]) - @pagy, @templates = pagy_auto(@templates, limit: 12) + @pagy, @templates = pagy_auto(@templates.select_for_list, limit: 12) return unless params[:q].present? && @templates.blank? @@ -31,6 +31,6 @@ class TemplatesArchivedController < ApplicationController related_submissions = Submissions.search(current_user, related_submissions, params[:q]) .order(id: :desc) - pagy_auto(related_submissions, limit: 5) + pagy_auto(related_submissions.select_for_list, limit: 5) end end diff --git a/app/controllers/templates_archived_submissions_controller.rb b/app/controllers/templates_archived_submissions_controller.rb index 39aa0877..cbe7e45a 100644 --- a/app/controllers/templates_archived_submissions_controller.rb +++ b/app/controllers/templates_archived_submissions_controller.rb @@ -15,7 +15,7 @@ class TemplatesArchivedSubmissionsController < ApplicationController @submissions.order(id: :desc) end - @pagy, @submissions = pagy_auto(@submissions.preload(submitters: :start_form_submission_events)) + @pagy, @submissions = pagy_auto(@submissions.select_for_list.preload(submitters: :start_form_submission_events)) rescue ActiveRecord::RecordNotFound redirect_to root_path end diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb index ae54665a..d7c90dbf 100644 --- a/app/controllers/templates_controller.rb +++ b/app/controllers/templates_controller.rb @@ -19,7 +19,7 @@ class TemplatesController < ApplicationController submissions.order(id: :desc) end - @pagy, @submissions = pagy_auto(submissions.preload(:template_accesses, submitters: :start_form_submission_events)) + @pagy, @submissions = pagy_auto(submissions.select_for_list.preload(:template_accesses, submitters: :start_form_submission_events)) rescue ActiveRecord::RecordNotFound redirect_to root_path end diff --git a/app/controllers/templates_dashboard_controller.rb b/app/controllers/templates_dashboard_controller.rb index 289afb43..d9a683c9 100644 --- a/app/controllers/templates_dashboard_controller.rb +++ b/app/controllers/templates_dashboard_controller.rb @@ -36,7 +36,8 @@ class TemplatesDashboardController < ApplicationController @templates = @templates.where(folder_id: @default_folder.id) if params[:q].blank? end - @pagy, @templates = load_templates(@templates, @pagy.count, show_shared_inline: @show_shared_inline) + @pagy, @templates = load_templates(@templates.select_for_list, @pagy.count, + show_shared_inline: @show_shared_inline) if params[:q].present? && @templates.blank? @related_submissions_pagy, @related_submissions = load_related_submissions @@ -130,6 +131,6 @@ class TemplatesDashboardController < ApplicationController related_submissions = Submissions.search(current_user, related_submissions, params[:q]) .order(id: :desc) - pagy_auto(related_submissions, limit: 5) + pagy_auto(related_submissions.select_for_list, limit: 5) end end diff --git a/app/controllers/templates_shared_controller.rb b/app/controllers/templates_shared_controller.rb index 62efd524..8855d94d 100644 --- a/app/controllers/templates_shared_controller.rb +++ b/app/controllers/templates_shared_controller.rb @@ -17,7 +17,7 @@ class TemplatesSharedController < ApplicationController @templates = Templates.search_shared(current_user, @templates, params[:q]) - @pagy, @templates = pagy_auto(@templates, limit: 12) + @pagy, @templates = pagy_auto(@templates.select_for_list, limit: 12) return unless params[:q].present? && @templates.blank? @@ -42,6 +42,6 @@ class TemplatesSharedController < ApplicationController related_submissions = Submissions.search(current_user, related_submissions, params[:q]) .order(id: :desc) - pagy_auto(related_submissions, limit: 5) + pagy_auto(related_submissions.select_for_list, limit: 5) end end diff --git a/app/models/submission.rb b/app/models/submission.rb index 92101b02..efd82fd1 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -107,6 +107,11 @@ class Submission < ApplicationRecord .and(Submitter.arel_table[:completed_at].eq(nil))).select(1).arel.exists) } + scope :select_for_list, lambda { + select(:id, :name, :created_by_user_id, :account_id, + :created_at, :archived_at, :expire_at, :template_id, :template_submitters) + } + enum :source, { invite: 'invite', bulk: 'bulk', diff --git a/app/models/template.rb b/app/models/template.rb index ca8b8d0f..c023ae89 100644 --- a/app/models/template.rb +++ b/app/models/template.rb @@ -81,6 +81,8 @@ class Template < ApplicationRecord scope :active, -> { where(archived_at: nil) } scope :archived, -> { where.not(archived_at: nil) } + scope :select_for_list, -> { select(:id, :name, :author_id, :account_id, :created_at, :archived_at, :folder_id) } + def application_key external_id end