diff --git a/lib/redmine/nested_set/issue_nested_set.rb b/lib/redmine/nested_set/issue_nested_set.rb index afbe6b9..8753f25 100644 --- a/lib/redmine/nested_set/issue_nested_set.rb +++ b/lib/redmine/nested_set/issue_nested_set.rb @@ -183,6 +183,16 @@ module Redmine end end + def rebuild_single_tree!(root_id) + root = Issue.where(:parent_id => nil).find(root_id) + transaction do + where(root_id: root_id).reorder(:id).lock.ids + where(root_id: root_id).update_all(:lft => nil, :rgt => nil) + where(root_id: root_id, parent_id: nil).update_all(["lft = ?, rgt = ?", 1, 2]) + rebuild_nodes(root_id) + end + end + private def rebuild_nodes(parent_id = nil) diff --git a/test/unit/issue_nested_set_test.rb b/test/unit/issue_nested_set_test.rb index 88f65d3..4062839 100644 --- a/test/unit/issue_nested_set_test.rb +++ b/test/unit/issue_nested_set_test.rb @@ -306,4 +306,23 @@ class IssueNestedSetTest < ActiveSupport::TestCase assert_equal ic2, ic4.parent assert ic5.root? end + + def test_rebuild_single_tree + i1 = Issue.generate! + i2 = i1.generate_child! + i3 = i1.generate_child! + Issue.update_all(:lft => 7, :rgt => 7) + + Issue.rebuild_single_tree!(i1.id) + + i1.reload + assert_equal [1, 6], [i1.lft, i1.rgt] + i2.reload + assert_equal [2, 3], [i2.lft, i2.rgt] + i3.reload + assert_equal [4, 5], [i3.lft, i3.rgt] + + other = Issue.find(1) + assert_equal [7, 7], [other.lft, other.rgt] + end end