From 9957883c4ddf53cbbee40e8c952f0a7aa0d703ca Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 24 Jul 2011 08:35:48 +0000 Subject: [PATCH] Fixed: Error deleting issue with grandchild (#8880). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@6311 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- test/unit/issue_nested_set_test.rb | 14 ++++++++++++++ .../awesome_nested_set/lib/awesome_nested_set.rb | 16 ++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/test/unit/issue_nested_set_test.rb b/test/unit/issue_nested_set_test.rb index 6cbc44461..103787a00 100644 --- a/test/unit/issue_nested_set_test.rb +++ b/test/unit/issue_nested_set_test.rb @@ -252,6 +252,20 @@ class IssueNestedSetTest < ActiveSupport::TestCase root = Issue.find(root.id) assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})" end + + def test_destroy_issue_with_grand_child + parent = create_issue! + issue = create_issue!(:parent_issue_id => parent.id) + child = create_issue!(:parent_issue_id => issue.id) + grandchild1 = create_issue!(:parent_issue_id => child.id) + grandchild2 = create_issue!(:parent_issue_id => child.id) + + assert_difference 'Issue.count', -4 do + Issue.find(issue.id).destroy + parent.reload + assert_equal [1, 2], [parent.lft, parent.rgt] + end + end def test_parent_priority_should_be_the_highest_child_priority parent = create_issue!(:priority => IssuePriority.find_by_name('Normal')) diff --git a/vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb b/vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb index f46fb4335..fcf00b3c3 100644 --- a/vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb +++ b/vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb @@ -446,16 +446,16 @@ module CollectiveIdea #:nodoc: def prune_from_tree return if right.nil? || left.nil? || leaf? || !self.class.exists?(id) - delete_method = acts_as_nested_set_options[:dependent] == :destroy ? - :destroy_all : :delete_all - - # TODO: should destroy children (not descendants) when deleted_method is :destroy_all self.class.base_class.transaction do reload_nested_set - nested_set_scope.send(delete_method, - ["#{quoted_left_column_name} > ? AND #{quoted_right_column_name} < ?", - left, right] - ) + if acts_as_nested_set_options[:dependent] == :destroy + children.each(&:destroy) + else + nested_set_scope.send(:delete_all, + ["#{quoted_left_column_name} > ? AND #{quoted_right_column_name} < ?", + left, right] + ) + end reload_nested_set diff = right - left + 1 nested_set_scope.update_all( -- 2.39.5