From 7d0ec48bcfa3b8a2983e0ee7b7fa7b2e71123ddc Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 13 Jan 2021 16:16:49 +0000 Subject: [PATCH] Improve performance on summing adjustments and payment :amount is a database field in these cases, as opposed to a method that returns a computed result. Calling `.sum(:amount)` is much more efficient here as it computes the sum at database level, as opposed to `.map(&:amount).sum`, which would fetch and instanciate all the objects first, and then sum the amounts after. --- app/helpers/checkout_helper.rb | 6 +++--- app/models/spree/order.rb | 4 ++-- .../app/services/order_management/order/updater.rb | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/helpers/checkout_helper.rb b/app/helpers/checkout_helper.rb index 4ae026bef7..8e54913dc5 100644 --- a/app/helpers/checkout_helper.rb +++ b/app/helpers/checkout_helper.rb @@ -19,7 +19,7 @@ module CheckoutHelper adjustments.reject! { |a| a.originator_type == 'EnterpriseFee' && a.source_type != 'Spree::LineItem' } unless exclude.include? :admin_and_handling adjustments << Spree::Adjustment.new( - label: I18n.t(:orders_form_admin), amount: enterprise_fee_adjustments.map(&:amount).sum + label: I18n.t(:orders_form_admin), amount: enterprise_fee_adjustments.sum(:amount) ) end @@ -28,7 +28,7 @@ module CheckoutHelper def display_checkout_admin_and_handling_adjustments_total_for(order) adjustments = order.adjustments.eligible.where('originator_type = ? AND source_type != ? ', 'EnterpriseFee', 'Spree::LineItem') - Spree::Money.new adjustments.map(&:amount).sum, currency: order.currency + Spree::Money.new adjustments.sum(:amount), currency: order.currency end def checkout_line_item_adjustments(order) @@ -36,7 +36,7 @@ module CheckoutHelper end def checkout_subtotal(order) - order.item_total + checkout_line_item_adjustments(order).map(&:amount).sum + order.item_total + checkout_line_item_adjustments(order).sum(:amount) end def display_checkout_subtotal(order) diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 4649b5a0e6..553ce01340 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -397,11 +397,11 @@ module Spree end def ship_total - adjustments.shipping.map(&:amount).sum + adjustments.shipping.sum(:amount) end def tax_total - adjustments.tax.map(&:amount).sum + adjustments.tax.sum(:amount) end # Creates new tax charges if there are any applicable rates. If prices already diff --git a/engines/order_management/app/services/order_management/order/updater.rb b/engines/order_management/app/services/order_management/order/updater.rb index e7cb051a4f..e303689617 100644 --- a/engines/order_management/app/services/order_management/order/updater.rb +++ b/engines/order_management/app/services/order_management/order/updater.rb @@ -55,9 +55,9 @@ module OrderManagement # - adjustment_total - total value of all adjustments # - total - order total, it's the equivalent to item_total plus adjustment_total def update_totals - order.payment_total = payments.completed.map(&:amount).sum + order.payment_total = payments.completed.sum(:amount) order.item_total = line_items.map(&:amount).sum - order.adjustment_total = adjustments.eligible.map(&:amount).sum + order.adjustment_total = adjustments.eligible.sum(:amount) order.total = order.item_total + order.adjustment_total end