diff --git a/app/models/spree/variant.rb b/app/models/spree/variant.rb index 5950886104..26a601d94a 100644 --- a/app/models/spree/variant.rb +++ b/app/models/spree/variant.rb @@ -170,6 +170,11 @@ module Spree select("spree_variants.id") }) end + def self.linked_to(semantic_id) + includes(:semantic_links).references(:semantic_links) + .where(semantic_links: { semantic_id: }).first + end + def tax_category super || TaxCategory.find_by(is_default: true) end diff --git a/spec/models/spree/variant_spec.rb b/spec/models/spree/variant_spec.rb index ef1f22fcdf..36860d1872 100644 --- a/spec/models/spree/variant_spec.rb +++ b/spec/models/spree/variant_spec.rb @@ -488,6 +488,19 @@ RSpec.describe Spree::Variant do end end + describe ".linked_to" do + let!(:variant_unlinked) { create(:variant) } + let!(:variant_linked) { create(:variant, semantic_links: [link]) } + let!(:variant_linked_unrelated) { create(:variant, semantic_links: [unrelated_link]) } + let(:link) { SemanticLink.new(semantic_id: "#my_precious") } + let(:unrelated_link) { SemanticLink.new(semantic_id: "#other") } + + it "finds a variant by link" do + expect(Spree::Variant.linked_to("#my_precious")) + .to eq variant_linked + end + end + describe "generating the product and variant name" do let(:product) { variant.product }