diff --git a/lib/paranoia.rb b/lib/paranoia.rb index 33ee47a7..b96d9ec7 100644 --- a/lib/paranoia.rb +++ b/lib/paranoia.rb @@ -247,6 +247,10 @@ def self.I_AM_THE_DESTROYER! def self.paranoid? ; false ; end def paranoid? ; self.class.paranoid? ; end + def self.delete_all(conditions=nil) + super and return unless paranoid? + where(conditions).update_all(self.new.send :paranoia_destroy_attributes) + end private def paranoia_column diff --git a/test/paranoia_test.rb b/test/paranoia_test.rb index 5198e280..d65445d7 100644 --- a/test/paranoia_test.rb +++ b/test/paranoia_test.rb @@ -918,6 +918,64 @@ def test_uniqueness_for_unparanoid_associated related.valid? end + def test_delete_all + model = ParanoidModel + count = 3 + models = count.times.map { model.new } + assert_equal 0, model.count + models.each(&:save!) + + assert_equal count, model.count + model.delete_all + + assert_equal 0, model.count + assert_equal count, model.with_deleted.count + + assert model.with_deleted.all?(&:deleted?) + end + + def test_delete_all_for_non_paranoid_model + model = PlainModel + count = 3 + models = count.times.map { model.new } + assert_equal 0, model.count + models.each(&:save!) + + assert_equal count, model.count + model.delete_all + + assert_equal 0, model.count + assert_equal 0, model.unscoped.count + end + + def test_destroy_all + model = ParanoidModel + count = 3 + models = count.times.map { model.new } + assert_equal 0, model.count + models.each(&:save!) + + assert_equal count, model.count + model.destroy_all + + assert_equal 0, model.count + assert_equal 3, model.unscoped.count + end + + def test_destroy_all_for_non_paranoid_model + model = PlainModel + count = 3 + models = count.times.map { model.new } + assert_equal 0, model.count + models.each(&:save!) + + assert_equal count, model.count + model.destroy_all + + assert_equal 0, model.count + assert_equal 0, model.unscoped.count + end + # TODO: find a fix for Rails 4.1 if ActiveRecord::VERSION::STRING !~ /\A4\.1/ def test_counter_cache_column_update_on_really_destroy