From 5045dd1d720b2f8a770ccb3950151290add2815b Mon Sep 17 00:00:00 2001 From: Alexei Mikhailov Date: Wed, 22 Aug 2012 19:46:15 +0600 Subject: [PATCH] Fixed behavior when *_destroy callbacks are critical. For example: ```ruby class Category < ActiveRecord::Base acts_as_ordered_tree before_destroy :crit def crit # something very critical end end root = Category.create child = root.children.create root.destroy # callback called only for root, children deleted silently ``` Now destroy method called for every descendant of destroyed node. --- lib/acts_as_ordered_tree.rb | 5 +++-- lib/acts_as_ordered_tree/instance_methods.rb | 4 +--- lib/acts_as_ordered_tree/version.rb | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/acts_as_ordered_tree.rb b/lib/acts_as_ordered_tree.rb index c13d11e..58faee9 100644 --- a/lib/acts_as_ordered_tree.rb +++ b/lib/acts_as_ordered_tree.rb @@ -33,7 +33,8 @@ def acts_as_ordered_tree(options = {}) :class_name => name, :foreign_key => options[:parent_column], :order => options[:position_column], - :inverse_of => (:parent unless options[:polymorphic]) + :inverse_of => (:parent unless options[:polymorphic]), + :dependent => :destroy } [:before_add, :after_add, :before_remove, :after_remove].each do |callback| @@ -83,7 +84,7 @@ def acts_as_ordered_tree(options = {}) after_save "move_to_child_with_index(parent, #{position_column})", :if => "#{position_column} && (#{position_column}_changed? || #{parent_column}_changed?)" - before_destroy :destroy_descendants + before_destroy :flush_descendants after_destroy "decrement_lower_positions(#{parent_column}_was, #{position_column}_was)", :if => position_column # setup validations diff --git a/lib/acts_as_ordered_tree/instance_methods.rb b/lib/acts_as_ordered_tree/instance_methods.rb index f2f06f2..a343a7a 100644 --- a/lib/acts_as_ordered_tree/instance_methods.rb +++ b/lib/acts_as_ordered_tree/instance_methods.rb @@ -329,9 +329,7 @@ def set_scope! #:nodoc: end end - def destroy_descendants #:nodoc: - descendants.delete_all - # flush memoization + def flush_descendants #:nodoc: @self_and_descendants = nil end diff --git a/lib/acts_as_ordered_tree/version.rb b/lib/acts_as_ordered_tree/version.rb index 0242c1c..50bf6d3 100644 --- a/lib/acts_as_ordered_tree/version.rb +++ b/lib/acts_as_ordered_tree/version.rb @@ -1,3 +1,3 @@ module ActsAsOrderedTree - VERSION = "1.0.3" + VERSION = "1.0.4" end