From c07ec6cdfd9e608e37afd21d60502f829a411bf0 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Wed, 30 Oct 2024 14:38:24 +1100 Subject: [PATCH] Polymorphically associate SemanticLinks to variant --- app/models/semantic_link.rb | 1 + ...30025540_copy_subject_on_semantic_links.rb | 11 +++++++++ ...540_copy_subject_on_semantic_links_spec.rb | 23 +++++++++++++++++++ spec/models/semantic_link_spec.rb | 1 + 4 files changed, 36 insertions(+) create mode 100644 db/migrate/20241030025540_copy_subject_on_semantic_links.rb create mode 100644 spec/migrations/20241030025540_copy_subject_on_semantic_links_spec.rb diff --git a/app/models/semantic_link.rb b/app/models/semantic_link.rb index ea8fa0bdba..86a6e821e6 100644 --- a/app/models/semantic_link.rb +++ b/app/models/semantic_link.rb @@ -2,6 +2,7 @@ # Link a Spree::Variant to an external DFC SuppliedProduct. class SemanticLink < ApplicationRecord + belongs_to :subject, polymorphic: true belongs_to :variant, class_name: "Spree::Variant" validates :semantic_id, presence: true diff --git a/db/migrate/20241030025540_copy_subject_on_semantic_links.rb b/db/migrate/20241030025540_copy_subject_on_semantic_links.rb new file mode 100644 index 0000000000..0ab1ff9337 --- /dev/null +++ b/db/migrate/20241030025540_copy_subject_on_semantic_links.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class CopySubjectOnSemanticLinks < ActiveRecord::Migration[7.0] + def up + execute <<~SQL.squish + UPDATE semantic_links SET + subject_id = variant_id, + subject_type = 'Spree::Variant' + SQL + end +end diff --git a/spec/migrations/20241030025540_copy_subject_on_semantic_links_spec.rb b/spec/migrations/20241030025540_copy_subject_on_semantic_links_spec.rb new file mode 100644 index 0000000000..3ec4346757 --- /dev/null +++ b/spec/migrations/20241030025540_copy_subject_on_semantic_links_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_relative '../../db/migrate/20241030025540_copy_subject_on_semantic_links' + +RSpec.describe CopySubjectOnSemanticLinks do + describe "#up" do + let(:original_variant) { create(:variant) } + let(:dummy_variant) { create(:variant) } + + it "copies the original data" do + link = SemanticLink.create!( + variant: original_variant, + subject: dummy_variant, # This would be NULL when migration runs. + semantic_id: "some-url", + ) + + expect { subject.up }.to change { + link.reload.subject + }.from(dummy_variant).to(original_variant) + end + end +end diff --git a/spec/models/semantic_link_spec.rb b/spec/models/semantic_link_spec.rb index ac0eae743f..3dcac99db5 100644 --- a/spec/models/semantic_link_spec.rb +++ b/spec/models/semantic_link_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe SemanticLink, type: :model do + it { is_expected.to belong_to :subject } it { is_expected.to belong_to :variant } it { is_expected.to validate_presence_of(:semantic_id) } end