diff --git a/lib/paranoia.rb b/lib/paranoia.rb index ee42abfa..d439c1b8 100644 --- a/lib/paranoia.rb +++ b/lib/paranoia.rb @@ -193,6 +193,24 @@ def timestamp_attributes_with_current_time timestamp_attributes_for_update_in_model.each_with_object({}) { |attr,hash| hash[attr] = current_time_from_proper_timezone } end + def transaction_include_any_action?(actions) #:nodoc: + actions.any? do |action| + case action + when :create + transaction_record_state(:new_record) + when :destroy + transaction_include_destroy? + when :update + !(transaction_record_state(:new_record) || transaction_include_destroy?) + end + end + end + + + def transaction_include_destroy? + destroyed? || try(:paranoia_destroyed?) + end + # restore associated records that have been soft deleted when # we called #destroy def restore_associated_records(recovery_window_range = nil) diff --git a/test/paranoia_test.rb b/test/paranoia_test.rb index 8c4c2d3f..25bfa3a5 100644 --- a/test/paranoia_test.rb +++ b/test/paranoia_test.rb @@ -111,6 +111,16 @@ def test_destroy_behavior_for_plain_models assert_equal 0, model.class.unscoped.count end + def test_destroy_behavior_for_conditional_models_callbacks + model = AfterCommitDestroyModel.new + model.save + model.reset_after_commit_callback_called # clear called callback flags + refute model.after_commit_callback_called + model.destroy + + assert model.after_commit_callback_called + end + # Anti-regression test for #81, which would've introduced a bug to break this test. def test_destroy_behavior_for_plain_models_callbacks model = CallbackModel.new @@ -1359,3 +1369,22 @@ class ParanoidBelongsTo < ActiveRecord::Base belongs_to :paranoid_has_one end end + +class AfterCommitDestroyModel < ActiveRecord::Base + self.table_name = "callback_models" + + attr_reader :after_commit_callback_called + + acts_as_paranoid + after_commit :callback_triggered, on: :destroy + + def reset_after_commit_callback_called + @after_commit_callback_called = false + end + + private + + def callback_triggered + @after_commit_callback_called = true + end +end