diff --git a/core/app/models/spree/stock/inventory_unit_builder.rb b/core/app/models/spree/stock/inventory_unit_builder.rb index 5cdfda1bca..5936048117 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 7723efd3f7..37709a31c0 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