From 0b3483c4af66ead7ed0f7db0db9d84fcc0435124 Mon Sep 17 00:00:00 2001 From: Martin Meyerhoff Date: Fri, 9 Apr 2021 15:39:56 +0200 Subject: [PATCH] Quickly delete elements when deleting a page version --- app/models/alchemy/page_version.rb | 8 ++++++++ spec/models/alchemy/page_version_spec.rb | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/app/models/alchemy/page_version.rb b/app/models/alchemy/page_version.rb index f622fa2e14..1c30bf1fdc 100644 --- a/app/models/alchemy/page_version.rb +++ b/app/models/alchemy/page_version.rb @@ -17,6 +17,8 @@ def self.public_on(time = Time.current) "OR #{table_name}.public_until >= :time)", time: time) end + before_destroy :delete_elements + # Determines if this version is public # # Takes the two timestamps +public_on+ and +public_until+ @@ -42,5 +44,11 @@ def already_public_for?(time = Time.current) def still_public_for?(time = Time.current) public_until.nil? || public_until >= time end + + private + + def delete_elements + DeleteElements.new(self.elements).call + end end end diff --git a/spec/models/alchemy/page_version_spec.rb b/spec/models/alchemy/page_version_spec.rb index a004b6cc4b..a4de4993e7 100644 --- a/spec/models/alchemy/page_version_spec.rb +++ b/spec/models/alchemy/page_version_spec.rb @@ -116,5 +116,26 @@ it { is_expected.to be(false) } end + + describe "dependent element destruction" do + let!(:parent_element) { create(:alchemy_element, :with_nestable_elements, :with_contents) } + let!(:nested_element) { parent_element.nested_elements.first } + let!(:normal_element) { create(:alchemy_element, :with_contents) } + + let(:page_version) { create(:alchemy_page_version) } + + before do + Alchemy::Element.update_all(page_version_id: page_version.id) + end + + it "deletes all elements along with the page version" do + page_version.destroy! + expect(Alchemy::Element.count).to be_zero + expect(Alchemy::Content.count).to be_zero + expect(Alchemy::EssenceText.count).to be_zero + expect(Alchemy::EssencePicture.count).to be_zero + expect(Alchemy::EssenceRichtext.count).to be_zero + end + end end end