# Converting Acts\_As\_Tree to Acts\_As\_Nested\_Set

**URL:** <https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551>\
**Category:** Rails\
**Created:** [February 17, 2009, 5:40pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551 "2009-02-17T17:40:19Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [February 17, 2009, 5:40pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/1 "2009-02-17T17:40:19Z")

</div>

Hello,

I have a tree structure that needs to be converted into a nested set.  
A great deal of work has already been done on the tree items, so  
maintaining the integrity of the id’s is mandatory. However I need  
the ability to access entire branches of the tree, which is what  
Nested set does. Does anyone have any suggestions on how to  
efficiently transfer the tree to the nested set and create the left  
and right boundaries?

Thanks!

---

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [February 17, 2009, 7:33pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/2 "2009-02-17T19:33:54Z")

</div>

Awesome\_Nested\_Set looks interesting as well. Maybe I should use  
that?

---

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [February 18, 2009, 5:17pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/3 "2009-02-18T17:17:32Z")

</div>

anyone have any ideas?

---

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [February 18, 2009, 5:45pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/4 "2009-02-18T17:45:50Z")

</div>

Mindtonic wrote:

> anyone have any ideas?

You should definitely use awesome\_nested\_set instead of  
acts\_as\_nested\_set. The former has much cleaner code.

If the size of your tree allows it, I would choose to recreate it using  
awesome\_nested\_set using move\_to instead of figuring out a smart  
algorithm for conversion. It’ll spare you development time and guarantee  
a proper conversion.

–  
Roderick van Domburg  
[http://www.nedforce.com](http://www.nedforce.com)

---

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [February 18, 2009, 6:14pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/5 "2009-02-18T18:14:14Z")

</div>

Is awesome\_nested\_set a better choice than better\_nested\_set? I found  
the following on the better\_nested\_set wiki page:

Migrating from acts\_as\_tree

In reference to migrating from acts\_as\_tree Krishna D. said, “If you  
have multiple trees in your table, it is a little more complicated.  
You first need to give each tree scope (add a tree\_id column) and then  
run the above method on a member of each tree.”

Not completely understanding that statement, I set out to implement it  
in a migration. Here is my result which appears to work. In this  
example, I am using a model named Categories:

class ConvertCategoriesToNestedSet \< ActiveRecord::Migration  
def self.up  
add\_column :categories, :lft, :integer  
add\_column :categories, :rgt, :integer  
add\_column :categories, :root\_id, :integer

```
# Convert existing tree to nested set with scope
Category.reset_column_information # So the new root ids get saved
Category.renumber_all
Category.roots.each do |r|
  r.all_children.each do |c|
    c.update_attribute(:root_id, r.id)
  end
  r.update_attribute(:root_id, r.id)
end

```

end

def self.down  
remove\_column :categories, :lft  
remove\_column :categories, :rgt  
remove\_column :categories, :root\_id  
end  
end

On Feb 18, 11:45 am, Roderick van Domburg \<rails-mailing-l…@andreas-

---

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [February 18, 2009, 7:32pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/6 "2009-02-18T19:32:07Z")

</div>

Every time I tries to run the migration, the rake aborted saying that  
there is a missing attribute ‘name’, which is definitely present in  
the model. Also, the awesome\_nested\_set rdocs fail to rake…  
rendering the concept useless as there is very little online  
documentation. Oh well…

On Feb 18, 1:00 pm, Roderick van Domburg \<rails-mailing-l…@andreas-

---

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [February 18, 2009, 7:00pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/7 "2009-02-18T19:00:06Z")

</div>

Mindtonic wrote:

> Is awesome\_nested\_set a better choice than better\_nested\_set? I found  
> the following on the better\_nested\_set wiki page:

Yes. Use awesome\_nested\_set instead.

> Migrating from acts\_as\_tree
> 
> In reference to migrating from acts\_as\_tree Krishna D. said, ï¿½If you  
> have multiple trees in your table, it is a little more complicated.  
> You first need to give each tree scope (add a tree\_id column) and then  
> run the above method on a member of each tree.ï¿½
> 
> Not completely understanding that statement, I set out to implement it  
> in a migration. Here is my result which appears to work. In this  
> example, I am using a model named Categories:

Never read and thought of that, but that should work great!

–  
Roderick van Domburg  
[http://www.nedforce.com](http://www.nedforce.com)

---

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [March 3, 2009, 1:24am UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/8 "2009-03-03T01:24:11Z")

</div>

SOLUTION:

You’re not going to believe this.

1. Install the plugin
2. Write and run a migration to add `lft` and `rgt` integer columns to  
your model
3. Change `acts_as_tree` to `acts_as_nested_set` in your model
4. Open the Console
5. type: NameOfYourModel.rebuild!

That’s it!

Woah, I’ve been looking for this for weeks. I hope it helps somebody  
out there.

---

<div class="post-metadata">

**Author:** ![mindtonic](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/f19dbf/32.png) [@mindtonic](https://www.ruby-forum.com/u/mindtonic)\
**Post date:** [May 30, 2009, 4:38pm UTC](https://www.ruby-forum.com/t/converting-acts-as-tree-to-acts-as-nested-set/160551/9 "2009-05-30T16:38:42Z")

</div>

Mindtonic wrote:

> SOLUTION:
> 
> You’re not going to believe this.
> 
> 1. Install the plugin
> 2. Write and run a migration to add `lft` and `rgt` integer columns to  
> your model
> 3. Change `acts_as_tree` to `acts_as_nested_set` in your model
> 4. Open the Console
> 5. type: NameOfYourModel.rebuild!
> 
> That’s it!
> 
> Woah, I’ve been looking for this for weeks. I hope it helps somebody  
> out there.  
> Hi,

Before migrating to awesome\_nested\_set, I’d like to know if moving  
things around happens easily.

Let’s say I have the following tree:

Root  
|- Hardware  
|- GPS  
|- Screens  
|- Keyboards  
|- Geek stuff  
|- iPod

Let’s say I want to move GPS to Geek Stuff, how does it work?
