From 04c0adf9603054bb38da049532aab82f81bfcc35 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 01:52:09 +0000 Subject: [PATCH] Fix source_variants and target_variants associations in Variant model Co-authored-by: dacook <4188088+dacook@users.noreply.github.com> Thanks co-pilot for sending me in the right direction. Would this be neater as a has_and_belongs_to_many? Maybe but I will try to keep moving. --- app/models/spree/variant.rb | 11 ++++++++--- spec/models/spree/variant_spec.rb | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/models/spree/variant.rb b/app/models/spree/variant.rb index 1245154860..16002013c5 100644 --- a/app/models/spree/variant.rb +++ b/app/models/spree/variant.rb @@ -72,9 +72,14 @@ module Spree has_many :semantic_links, as: :subject, dependent: :delete_all has_many :supplier_properties, through: :supplier, source: :properties - has_many :variant_links, dependent: :delete_all - has_many :source_variants, through: :variant_links - has_many :target_variants, through: :variant_links + # Linked variants: I may have one or many sources. + has_many :variant_links_as_target, class_name: 'VariantLink', foreign_key: :target_variant_id, + dependent: :delete_all, inverse_of: :target_variant + has_many :source_variants, through: :variant_links_as_target, source: :source_variant + # I may also have one more many targets. + has_many :variant_links_as_source, class_name: 'VariantLink', foreign_key: :source_variant_id, + dependent: :delete_all, inverse_of: :source_variant + has_many :target_variants, through: :variant_links_as_source, source: :target_variant localize_number :price, :weight diff --git a/spec/models/spree/variant_spec.rb b/spec/models/spree/variant_spec.rb index 86d3ca92ff..92138a0ea2 100644 --- a/spec/models/spree/variant_spec.rb +++ b/spec/models/spree/variant_spec.rb @@ -20,6 +20,9 @@ RSpec.describe Spree::Variant do it { is_expected.to have_many(:inventory_items) } it { is_expected.to have_many(:supplier_properties).through(:supplier) } + it { is_expected.to have_many(:source_variants).through(:variant_links_as_target) } + it { is_expected.to have_many(:target_variants).through(:variant_links_as_source) } + describe "shipping category" do it "sets a shipping category if none provided" do variant = build(:variant, shipping_category: nil)