diff --git a/app/models/concerns/relationable.rb b/app/models/concerns/relationable.rb index f4da34ed5..84a945bad 100644 --- a/app/models/concerns/relationable.rb +++ b/app/models/concerns/relationable.rb @@ -2,6 +2,6 @@ module Relationable extend ActiveSupport::Concern included do - has_many :related_contents, as: :parent_relationable + has_many :related_contents, as: :parent_relationable, dependent: :destroy end end diff --git a/app/models/related_content.rb b/app/models/related_content.rb index 6b85d14db..0837cff32 100644 --- a/app/models/related_content.rb +++ b/app/models/related_content.rb @@ -10,6 +10,7 @@ class RelatedContent < ActiveRecord::Base validates :parent_relationable_id, uniqueness: { scope: [:parent_relationable_type, :child_relationable_id, :child_relationable_type] } after_create :create_opposite_related_content, unless: proc { opposite_related_content.present? } + after_destroy :destroy_opposite_related_content, if: proc { opposite_related_content.present? } private @@ -18,4 +19,7 @@ class RelatedContent < ActiveRecord::Base self.opposite_related_content = related_content end + def destroy_opposite_related_content + opposite_related_content.destroy + end end diff --git a/spec/models/relation_spec.rb b/spec/models/relation_spec.rb index 1d4bcd91d..ebefa51fa 100644 --- a/spec/models/relation_spec.rb +++ b/spec/models/relation_spec.rb @@ -38,4 +38,14 @@ describe RelatedContent do end end + describe 'relationable destroy' do + let(:parent_relationable) { create(:proposal) } + let(:child_relationable) { create(:debate) } + + it 'destroys both related contents involved' do + related_content = create(:related_content, parent_relationable: parent_relationable, child_relationable: child_relationable) + expect { related_content.parent_relationable.destroy }.to change { RelatedContent.all.count }.by(-2) + expect(child_relationable.related_contents).to be_empty + end + end end