Project

General

Profile

Feature #24167

Updated by Toshi MARUYAMA over 7 years ago

After updating to Redmine 3.3 we began to encounter broken issue trees quite often. Root and parent ids are ok, but lft and rgt values get messed up somehow. We have ~250k issues so using @Issue.rebuild_tree!@ is a rather expensive task with enormous overhead as 99.99% of nested sets are ok and it is usually one or two that get broken from time to time. 

 I suppose having a possibility to rebuild only a single nested set would be very useful in such situations. Below is the code I'm using to do so now - just added it to /lib/redmine/nested_set/issue_nested_set.rb 

 <pre><code class="ruby"> 
 def <pre>def rebuild_single_tree!(root_id) 
   root = Issue.find(root_id) 
   if root.blank? || !root.parent_id.blank? 
     p "Wrong root specified" 
     return 
   end 
   transaction do            
     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 
 </code></pre> end</pre>

Back