From 0ca87580e83fe861dfb2856f8c88c39aa6333a8b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 9 Apr 2020 19:48:13 +0200 Subject: [PATCH 1/2] Load variants in cart in one query Avoids an N+1 --- app/services/variants_stock_levels.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/services/variants_stock_levels.rb b/app/services/variants_stock_levels.rb index 73f6e68278..5763996752 100644 --- a/app/services/variants_stock_levels.rb +++ b/app/services/variants_stock_levels.rb @@ -8,10 +8,12 @@ class VariantsStockLevels variant_stock_levels = variant_stock_levels(order.line_items) order_variant_ids = variant_stock_levels.keys - missing_variant_ids = requested_variant_ids - order_variant_ids - missing_variant_ids.each do |variant_id| - variant = scoped_variant(order.distributor, Spree::Variant.find(variant_id)) - variant_stock_levels[variant_id] = { quantity: 0, max_quantity: 0, on_hand: variant.on_hand, on_demand: variant.on_demand } + missing_variants = Spree::Variant.where(id: (requested_variant_ids - order_variant_ids)) + + missing_variants.each do |missing_variant| + variant = scoped_variant(order.distributor, missing_variant) + variant_stock_levels[variant.id] = + { quantity: 0, max_quantity: 0, on_hand: variant.on_hand, on_demand: variant.on_demand } end variant_stock_levels From 57d87a804264f3d138d34050792d799cc643cfde Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 9 Apr 2020 19:48:50 +0200 Subject: [PATCH 2/2] Eager-load variant stock items Avoids another N+1 --- app/services/variants_stock_levels.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/services/variants_stock_levels.rb b/app/services/variants_stock_levels.rb index 5763996752..f06002db19 100644 --- a/app/services/variants_stock_levels.rb +++ b/app/services/variants_stock_levels.rb @@ -8,7 +8,8 @@ class VariantsStockLevels variant_stock_levels = variant_stock_levels(order.line_items) order_variant_ids = variant_stock_levels.keys - missing_variants = Spree::Variant.where(id: (requested_variant_ids - order_variant_ids)) + missing_variants = Spree::Variant.includes(:stock_items). + where(id: (requested_variant_ids - order_variant_ids)) missing_variants.each do |missing_variant| variant = scoped_variant(order.distributor, missing_variant)