From ee909aa576e502387b42ac5fe1c608577ce10c12 Mon Sep 17 00:00:00 2001 From: Ikraam Ghoor Date: Fri, 26 Jun 2026 06:56:03 +0200 Subject: [PATCH] Preload variants when building inventory units Building inventory units loads each line item's variant, and the variant's product when resolving the shipping category, with a query per line item. This runs whenever proposed shipments are rebuilt. Preloading the variant and product for all line items keeps that load constant regardless of how many items the order has. --- core/app/models/spree/stock/inventory_unit_builder.rb | 1 + .../models/spree/stock/inventory_unit_builder_spec.rb | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/core/app/models/spree/stock/inventory_unit_builder.rb b/core/app/models/spree/stock/inventory_unit_builder.rb index 5cdfda1bcaf..5936048117d 100644 --- a/core/app/models/spree/stock/inventory_unit_builder.rb +++ b/core/app/models/spree/stock/inventory_unit_builder.rb @@ -8,6 +8,7 @@ def initialize(order) end def units + ActiveRecord::Associations::Preloader.new(records: @order.line_items, associations: {variant: :product}).call @order.line_items.flat_map do |line_item| build_units(line_item, line_item.quantity) end diff --git a/core/spec/models/spree/stock/inventory_unit_builder_spec.rb b/core/spec/models/spree/stock/inventory_unit_builder_spec.rb index 7723efd3f7f..37709a31c0f 100644 --- a/core/spec/models/spree/stock/inventory_unit_builder_spec.rb +++ b/core/spec/models/spree/stock/inventory_unit_builder_spec.rb @@ -28,6 +28,16 @@ module Stock it "builds the inventory units as pending" do expect(subject.units.map(&:pending).uniq).to eq [true] end + + context "with multiple line items" do + let(:order) { create(:order_with_line_items, line_items_count: 3) } + + before { order.reload } + + it "loads line item variants in a single query" do + expect { described_class.new(order).units }.to make_database_queries(matching: /from .spree_variants..*\bid. IN \(/im, count: 1) + end + end end describe "#missing_units_for_line_item" do