From 801b153cb41acb841440359c4cab7bc98277efd5 Mon Sep 17 00:00:00 2001 From: Djilani Kebaili Date: Fri, 17 Sep 2021 18:14:12 +0200 Subject: [PATCH 1/3] update Rails --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 6c061d29..dea75270 100644 --- a/Gemfile +++ b/Gemfile @@ -18,7 +18,7 @@ platforms :rbx do gem 'rubysl-test-unit' end -rails = ENV['RAILS'] || '~> 5.2.0' +rails = ENV['RAILS'] || '~> 6.0.4' if rails == 'master' gem 'rails', github: 'rails/rails' From d87fe45a14d64a0272e9c59f8f18b719f57207ad Mon Sep 17 00:00:00 2001 From: Djilani Kebaili Date: Fri, 17 Sep 2021 18:15:01 +0200 Subject: [PATCH 2/3] add specs for broken case --- test/paranoia_test.rb | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/test/paranoia_test.rb b/test/paranoia_test.rb index 84e60fcf..a2536998 100644 --- a/test/paranoia_test.rb +++ b/test/paranoia_test.rb @@ -30,6 +30,7 @@ def setup! 'featureful_models' => 'deleted_at DATETIME, name VARCHAR(32)', 'plain_models' => 'deleted_at DATETIME', 'callback_models' => 'deleted_at DATETIME', + 'after_commit_callback_models' => 'deleted_at DATETIME', 'fail_callback_models' => 'deleted_at DATETIME', 'related_models' => 'parent_model_id INTEGER, parent_model_with_counter_cache_column_id INTEGER, deleted_at DATETIME', 'asplode_models' => 'parent_model_id INTEGER, deleted_at DATETIME', @@ -147,6 +148,20 @@ def test_destroy_behavior_for_freshly_loaded_plain_models_callbacks assert model.instance_variable_get(:@after_commit_callback_called) end + def test_destroy_behavior_for_freshly_saved_models_after_commit_callbacks + model = AfterCommitCallbackModel.create! + + assert_equal 1, model.after_create_commit_called_times + assert_equal 0, model.after_destroy_commit_called_times + + # clear the counters, but do not reload from DB + model.remove_called_variables + + model.destroy + assert_equal 0, model.after_create_commit_called_times + assert_equal 1, model.after_destroy_commit_called_times + end + def test_delete_behavior_for_plain_models_callbacks model = CallbackModel.new model.save @@ -1136,6 +1151,33 @@ def remove_called_variables end end +class AfterCommitCallbackModel < ActiveRecord::Base + acts_as_paranoid + + after_commit :increment_after_create_commit_called_times, on: :create + after_commit :increment_after_destroy_commit_called_times, on: :destroy + + def increment_after_create_commit_called_times + @after_create_commit_called_times = after_create_commit_called_times + 1 + end + + def increment_after_destroy_commit_called_times + @after_destroy_commit_called_times = after_destroy_commit_called_times + 1 + end + + def after_create_commit_called_times + @after_create_commit_called_times || 0 + end + + def after_destroy_commit_called_times + @after_destroy_commit_called_times || 0 + end + + def remove_called_variables + instance_variables.each {|name| (name.to_s.end_with?('_called_times')) ? remove_instance_variable(name) : nil} + end +end + class ParentModel < ActiveRecord::Base acts_as_paranoid has_many :paranoid_models From 6cc5a94362ab7c82ce985e6cee22c1556b7124e8 Mon Sep 17 00:00:00 2001 From: Djilani Kebaili Date: Fri, 17 Sep 2021 18:15:08 +0200 Subject: [PATCH 3/3] apply fix --- lib/paranoia.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/paranoia.rb b/lib/paranoia.rb index 13b38ab3..6bdae81e 100644 --- a/lib/paranoia.rb +++ b/lib/paranoia.rb @@ -58,7 +58,7 @@ def restore(id_or_ids, opts = {}) end def paranoia_destroy - transaction do + with_transaction_returning_status do run_callbacks(:destroy) do @_disable_counter_cache = deleted? result = paranoia_delete @@ -143,7 +143,7 @@ def paranoia_destroyed? alias :deleted? :paranoia_destroyed? def really_destroy! - transaction do + with_transaction_returning_status do run_callbacks(:real_destroy) do @_disable_counter_cache = paranoia_destroyed? dependent_reflections = self.class.reflections.select do |name, reflection|