From 0b565e47645788b8746fcae21a0badbe9a6d6cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonc=CC=A7alo=20Silva?= Date: Thu, 8 Mar 2012 04:10:34 +0000 Subject: [PATCH] Considerably simplified logic behind window-based recovery. Removed unnecessary scope. --- lib/acts_as_paranoid/core.rb | 18 +++++++++++++----- lib/rails3_acts_as_paranoid.rb | 16 +++------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/lib/acts_as_paranoid/core.rb b/lib/acts_as_paranoid/core.rb index c2da4a0..5fa6a98 100644 --- a/lib/acts_as_paranoid/core.rb +++ b/lib/acts_as_paranoid/core.rb @@ -74,7 +74,7 @@ def paranoid_value def destroy! with_transaction_returning_status do run_callbacks :destroy do - act_on_dependent_destroy_associations + destroy_dependent_associations! self.class.delete_all!(self.class.primary_key.to_sym => self.id) self.paranoid_value = self.class.delete_now_value freeze @@ -116,20 +116,20 @@ def recover_dependent_associations(window, options) self.class.dependent_associations.each do |association| if association.collection? && self.send(association.name).paranoid? self.send(association.name).unscoped do - self.send(association.name).paranoid_deleted_around_time(paranoid_value, window).each do |object| + only_deleted_inside_window_if_time_paranoid(self.send(association.name), paranoid_value, window).each do |object| object.recover(options) end end elsif association.klass.paranoid? if association.macro == :has_one association.klass.unscoped do - object = association.klass.paranoid_deleted_around_time(paranoid_value, window).send('find_by_'+association.foreign_key, self.id) + object = only_deleted_inside_window_if_time_paranoid(association.klass, paranoid_value, window).send('find_by_'+association.foreign_key, self.id) object.recover(options) if object end else association.klass.unscoped do id = self.send(association.foreign_key) - object = association.klass.paranoid_deleted_around_time(paranoid_value, window).find_by_id(id) + object = only_deleted_inside_window_if_time_paranoid(association.klass, paranoid_value, window).find_by_id(id) object.recover(options) if object end end @@ -137,7 +137,15 @@ def recover_dependent_associations(window, options) end end - def act_on_dependent_destroy_associations + def only_deleted_inside_window_if_time_paranoid(klass, value, window) + if klass.paranoid_column_type == 'time' + klass.where("#{klass.paranoid_column} > ? AND #{klass.paranoid_column} < ?", (value - window), (value + window)) + else + klass.only_deleted + end + end + + def destroy_dependent_associations! self.class.dependent_associations.each do |association| if association.collection? && self.send(association.name).paranoid? association.klass.with_deleted.instance_eval("find_all_by_#{association.foreign_key}(#{self.id.to_json})").each do |object| diff --git a/lib/rails3_acts_as_paranoid.rb b/lib/rails3_acts_as_paranoid.rb index dd7168c..8bf14a7 100644 --- a/lib/rails3_acts_as_paranoid.rb +++ b/lib/rails3_acts_as_paranoid.rb @@ -31,22 +31,12 @@ def acts_as_paranoid(options = {}) self.paranoid_column_reference = "#{self.table_name}.#{paranoid_configuration[:column]}" return if paranoid? - - # Magic! - default_scope { where(paranoid_default_scope_sql) } - - scope :paranoid_deleted_around_time, lambda {|value, window| - if self.class.respond_to?(:paranoid?) && self.class.paranoid? - if self.class.paranoid_column_type == 'time' && ![true, false].include?(value) - self.where("#{self.class.paranoid_column} > ? AND #{self.class.paranoid_column} < ?", (value - window), (value + window)) - else - self.only_deleted - end - end - } include ActsAsParanoid::Core include ActsAsParanoid::Associations + + # Magic! + default_scope { where(paranoid_default_scope_sql) } end end