Modify Spree::Stock::Quantifier to not re-fetch stock items if they are already eager-loaded

This helps to remove a big N+1 here, and will also be very helpful elsewhere in the app
This commit is contained in:
Matt-Yorkley
2020-04-07 15:15:25 +02:00
parent f9cf826f1c
commit f959e632ea

View File

@@ -5,7 +5,7 @@ module Spree
def initialize(variant)
@variant = variant
@stock_items = Spree::StockItem.joins(:stock_location).where(:variant_id => @variant, Spree::StockLocation.table_name =>{ :active => true})
@stock_items = fetch_stock_items
end
def total_on_hand
@@ -23,6 +23,16 @@ module Spree
def can_supply?(required)
total_on_hand >= required || backorderable?
end
private
def fetch_stock_items
# Don't re-fetch associated stock items from the DB if we've already eager-loaded them
return @variant.stock_items.to_a if @variant.stock_items.loaded?
Spree::StockItem.joins(:stock_location).
where(:variant_id => @variant, Spree::StockLocation.table_name => { active: true })
end
end
end
end