From 798c60d0d567d6c8703793239ad1df474e382d82 Mon Sep 17 00:00:00 2001 From: Ikraam Ghoor Date: Fri, 26 Jun 2026 07:31:32 +0200 Subject: [PATCH] Eager load line item details on the admin order page The admin order page rendered each line item's variant, product, images and option values lazily, so the query count grew with the number of items in the order. Eager loading those associations keeps the page's query count constant regardless of how many line items the order has. --- .../solidus_admin/orders_controller.rb | 6 ++--- .../requests/solidus_admin/orders_spec.rb | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 admin/spec/requests/solidus_admin/orders_spec.rb diff --git a/admin/app/controllers/solidus_admin/orders_controller.rb b/admin/app/controllers/solidus_admin/orders_controller.rb index 7e9cf6efc1..a2829f8b3c 100644 --- a/admin/app/controllers/solidus_admin/orders_controller.rb +++ b/admin/app/controllers/solidus_admin/orders_controller.rb @@ -36,7 +36,7 @@ def new end def show - load_order + load_order(Spree::Order.includes(line_items: {variant: [:images, {product: :variant_images, option_values: :option_type}]})) respond_to do |format| format.html { render component("orders/show").new(order: @order) } @@ -111,8 +111,8 @@ def customers_for private - def load_order - @order = Spree::Order.find_by!(number: params[:id]) + def load_order(scope = Spree::Order) + @order = scope.find_by!(number: params[:id]) authorize! action_name, @order end diff --git a/admin/spec/requests/solidus_admin/orders_spec.rb b/admin/spec/requests/solidus_admin/orders_spec.rb new file mode 100644 index 0000000000..de88c67c64 --- /dev/null +++ b/admin/spec/requests/solidus_admin/orders_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe "SolidusAdmin::OrdersController", type: :request do + let(:admin_user) { create(:admin_user) } + + before do + allow(SolidusAdmin::Config).to receive(:enable_alpha_features?).and_return(true) + allow_any_instance_of(SolidusAdmin::BaseController).to receive(:spree_current_user).and_return(admin_user) + end + + describe "GET #show" do + let(:order) { create(:completed_order_with_totals, line_items_count: 3) } + + it "renders successfully" do + get solidus_admin.order_path(order) + expect(response).to have_http_status(:ok) + end + + it "loads line item variants in a single query" do + expect { get solidus_admin.order_path(order) } + .to make_database_queries(matching: /from .spree_variants..*\bid. IN \(/im, count: 1) + end + end +end