From 05f0e715453114e7143d87de9b9fc6ef8aba9425 Mon Sep 17 00:00:00 2001 From: David Cook Date: Wed, 1 Apr 2026 10:39:18 +1100 Subject: [PATCH] Create variant links through Rails association This allows us to delay saving to the db, reducing overall queries. --- lib/spree/core/product_duplicator.rb | 8 +- .../lib/spree/core/product_duplicator_spec.rb | 91 +++++-------------- 2 files changed, 28 insertions(+), 71 deletions(-) diff --git a/lib/spree/core/product_duplicator.rb b/lib/spree/core/product_duplicator.rb index c36c934ea3..d34b45aaeb 100644 --- a/lib/spree/core/product_duplicator.rb +++ b/lib/spree/core/product_duplicator.rb @@ -56,10 +56,10 @@ module Spree target_variant: [mapped_variants.keys]) # Link the new variants variant_links.find_each do |variant_link| - VariantLink.create( - source_variant: mapped_variants[variant_link.source_variant], - target_variant: mapped_variants[variant_link.target_variant] - ) + source_variant = mapped_variants[variant_link.source_variant] + target_variant = mapped_variants[variant_link.target_variant] + + target_variant.variant_links_as_target.new(source_variant:) end end diff --git a/spec/lib/spree/core/product_duplicator_spec.rb b/spec/lib/spree/core/product_duplicator_spec.rb index 5623c8ab3f..ab952c17b5 100644 --- a/spec/lib/spree/core/product_duplicator_spec.rb +++ b/spec/lib/spree/core/product_duplicator_spec.rb @@ -101,85 +101,42 @@ RSpec.describe Spree::Core::ProductDuplicator do "VariantLink Load", "Spree::Variant Load", "Spree::Variant Load", - "TRANSACTION", - "Spree::ShippingCategory Load", - "Spree::Product Load", - "Spree::Taxon Load", - "Enterprise Load", - "Spree::Variant Create", - "Spree::Price Create", - "Spree::StockItem Exists?", - "Spree::StockItem Exists?", - "Spree::StockItem Create", - "ActsAsTaggableOn::Tagging Load", - "Spree::Variant Update", - "Spree::ShippingCategory Load", - "Spree::Product Load", - "Spree::Taxon Load", - "Enterprise Load", - "Spree::Variant Create", - "Spree::Price Create", - "Spree::StockItem Exists?", - "Spree::StockItem Exists?", - "Spree::StockItem Create", - "ActsAsTaggableOn::Tagging Load", - "Spree::Variant Update", - "VariantLink Create", - "Spree::Product Update", - "Spree::Variant Exists?", - "Spree::Variant Load", - "Enterprise Load", - "Enterprise Update", - "Enterprise Update All", - "Spree::Taxon Update", - "Enterprise Update", - "Enterprise Update All", - "TRANSACTION", "Spree::Variant Load", "Spree::Variant Load", "TRANSACTION", "Spree::ShippingCategory Load", - "Spree::Product Load", "Spree::Taxon Load", "Enterprise Load", - "Spree::Variant Create", - "Spree::Price Create", - "Spree::StockItem Exists?", - "Spree::StockItem Exists?", - "Spree::StockItem Create", - "ActsAsTaggableOn::Tagging Load", - "Spree::Variant Update", - "VariantLink Create", - "Spree::Product Update", - "Spree::Variant Exists?", - "Spree::Variant Load", + "Spree::ShippingCategory Load", + "Spree::Taxon Load", + "Enterprise Load", + "Spree::ShippingCategory Load", + "Spree::Taxon Load", "Enterprise Load", - "Enterprise Update", - "Enterprise Update All", - "Spree::Taxon Update", - "Enterprise Update", - "Enterprise Update All", - "TRANSACTION", - "TRANSACTION", "Spree::Product Create", - "Spree::Variant Update", - "Spree::StockItem Load", + "Spree::Variant Create", + "Spree::Price Create", "Spree::StockItem Exists?", - "Spree::Product Load", - "Spree::Variant Update", - "Spree::StockItem Load", "Spree::StockItem Exists?", - "Spree::Product Load", + "Spree::StockItem Create", + "ActsAsTaggableOn::Tagging Load", "Spree::Variant Update", - "Spree::StockItem Load", + "Spree::Variant Create", + "Spree::Price Create", + "VariantLink Create", "Spree::StockItem Exists?", - "Spree::Product Load", - "Spree::Product Update", - "Spree::Variant Exists?", - "Spree::Variant Load", - "Enterprise Load", - "Enterprise Update", - "Enterprise Update All", + "Spree::StockItem Exists?", + "Spree::StockItem Create", + "ActsAsTaggableOn::Tagging Load", + "Spree::Variant Update", + "Spree::Variant Create", + "Spree::Price Create", + "VariantLink Create", + "Spree::StockItem Exists?", + "Spree::StockItem Exists?", + "Spree::StockItem Create", + "ActsAsTaggableOn::Tagging Load", + "Spree::Variant Update", "Spree::Product Update", "Enterprise Update", "Enterprise Update All",