From 25c63ec74727261c41bd1eec56a04a08e6a4ad07 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Fri, 23 Nov 2012 17:50:46 +0000 Subject: [PATCH] Adds a Project.rebuild_tree! method to force the rebuild of the nested set. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10867 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/project.rb | 9 +++++++++ test/unit/project_nested_set_test.rb | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/app/models/project.rb b/app/models/project.rb index 295d3cb05..f58a14bae 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -393,6 +393,15 @@ class Project < ActiveRecord::Base end end + # Recalculates all lft and rgt values based on project names + # Unlike Project.rebuild!, these values are recalculated even if the tree "looks" valid + def self.rebuild_tree! + transaction do + update_all "lft = NULL, rgt = NULL" + rebuild!(false) + end + end + # Returns an array of the trackers used by the project and its active sub projects def rolled_up_trackers @rolled_up_trackers ||= diff --git a/test/unit/project_nested_set_test.rb b/test/unit/project_nested_set_test.rb index 3bd37609b..b038f30ac 100644 --- a/test/unit/project_nested_set_test.rb +++ b/test/unit/project_nested_set_test.rb @@ -54,6 +54,15 @@ class ProjectNestedSetTest < ActiveSupport::TestCase assert_valid_nested_set end + def test_rebuild_tree_should_build_valid_tree_even_with_valid_lft_rgt_values + Project.update_all "name = 'YY'", {:id => @a.id } + # lft and rgt values are still valid (Project.rebuild! would not update anything) + # but projects are not ordered properly (YY is in the first place) + + Project.rebuild_tree! + assert_valid_nested_set + end + def test_moving_a_child_to_a_different_parent_should_keep_valid_tree assert_no_difference 'Project.count' do Project.find_by_name('B1').set_parent!(Project.find_by_name('A2'))