From 434c9ae1101fc1e291a53c88e5b9abbccc4e6ab5 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Thu, 18 May 2023 15:24:36 +0100 Subject: [PATCH 1/3] Delete exchange variants in bulk when deleting an order cycle --- app/models/exchange.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/models/exchange.rb b/app/models/exchange.rb index e52d412c96..f945898402 100644 --- a/app/models/exchange.rb +++ b/app/models/exchange.rb @@ -16,7 +16,7 @@ class Exchange < ApplicationRecord belongs_to :sender, class_name: 'Enterprise' belongs_to :receiver, class_name: 'Enterprise' - has_many :exchange_variants, dependent: :destroy + has_many :exchange_variants, dependent: :delete_all has_many :variants, through: :exchange_variants has_many :exchange_fees, dependent: :destroy @@ -25,6 +25,8 @@ class Exchange < ApplicationRecord validates :order_cycle, :sender, :receiver, presence: true validates :sender_id, uniqueness: { scope: [:order_cycle_id, :receiver_id, :incoming] } + before_destroy :delete_related_exchange_variants, prepend: true + after_save :touch_receiver accepts_nested_attributes_for :variants @@ -118,4 +120,11 @@ class Exchange < ApplicationRecord variant_ids.map{ |variant_id| { variant_id: variant_id, exchange_id: exchange_id } } ) end + + def delete_related_exchange_variants + ExchangeVariant.where(variant_id: variant_ids). + joins(:exchange). + where(exchanges: { order_cycle: order_cycle, incoming: false }). + delete_all + end end From a8559e621fb70a99e09dfc05c5377bfc15758b54 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 19 May 2023 10:54:15 +0100 Subject: [PATCH 2/3] Simplify exchange variant callback and prefer delete over destroy Delete is faster than destroy but should only be used if the object has no callbacks or touches. --- app/models/exchange_variant.rb | 10 +++++++--- app/services/variant_deleter.rb | 9 --------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/models/exchange_variant.rb b/app/models/exchange_variant.rb index ac835523af..ca3169bde8 100644 --- a/app/models/exchange_variant.rb +++ b/app/models/exchange_variant.rb @@ -3,9 +3,13 @@ class ExchangeVariant < ApplicationRecord belongs_to :exchange belongs_to :variant, class_name: 'Spree::Variant' - after_destroy :destroy_related_outgoing_variants - def destroy_related_outgoing_variants - VariantDeleter.new.destroy_related_outgoing_variants(variant_id, exchange.order_cycle) + after_destroy :delete_related_outgoing_variants + + def delete_related_outgoing_variants + ExchangeVariant.where(variant_id: variant_id). + joins(:exchange). + where(exchanges: { order_cycle: exchange.order_cycle, incoming: false }). + delete_all end end diff --git a/app/services/variant_deleter.rb b/app/services/variant_deleter.rb index d294dfcb98..fb9637f780 100644 --- a/app/services/variant_deleter.rb +++ b/app/services/variant_deleter.rb @@ -11,15 +11,6 @@ class VariantDeleter variant.destroy end - def destroy_related_outgoing_variants(variant_id, order_cycle) - internal_variants = ExchangeVariant.where(variant_id: variant_id). - joins(:exchange). - where( - exchanges: { order_cycle: order_cycle, incoming: false } - ) - internal_variants.destroy_all - end - private def only_variant_on_product?(variant) From 459ef5f0d1a1ac02b5d50bbac22b57143b4073a6 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Mon, 22 May 2023 11:09:29 +0100 Subject: [PATCH 3/3] Only delete related exchange variants if exchange is outgoing --- app/models/exchange.rb | 2 ++ app/models/exchange_variant.rb | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/models/exchange.rb b/app/models/exchange.rb index f945898402..4657f92946 100644 --- a/app/models/exchange.rb +++ b/app/models/exchange.rb @@ -122,6 +122,8 @@ class Exchange < ApplicationRecord end def delete_related_exchange_variants + return unless incoming? + ExchangeVariant.where(variant_id: variant_ids). joins(:exchange). where(exchanges: { order_cycle: order_cycle, incoming: false }). diff --git a/app/models/exchange_variant.rb b/app/models/exchange_variant.rb index ca3169bde8..a3dfc01a40 100644 --- a/app/models/exchange_variant.rb +++ b/app/models/exchange_variant.rb @@ -7,6 +7,8 @@ class ExchangeVariant < ApplicationRecord after_destroy :delete_related_outgoing_variants def delete_related_outgoing_variants + return unless exchange.incoming? + ExchangeVariant.where(variant_id: variant_id). joins(:exchange). where(exchanges: { order_cycle: exchange.order_cycle, incoming: false }).