Trees
Let’s think about the most complex relationship in Photo
Share: nested categories. You could implement
categories by adding belongs_to
:category and has_many :categories to the Category class. The resulting code would be
awkward because a category would have an attribute called category (for the parent)
and another called categories for the
children. parent and children attributes would be better, but you’d
be forced to override Active Record naming conventions and to write much
more code.
This arrangement is common enough that Active Record has the
acts_as_tree relationship, shown in
Figure 4-6. Just as you did with acts_as_list, you will need to install a
plug-in.
$ script/plugin install acts_as_tree + ./README + ./Rakefile + ./init.rb + ./lib/active_record/acts/tree.rb ...
acts_as_tree requires a foreign
key called parent_id by default. Recall
that we added parent_id to photos as part of the initial photos create_categories migration in Chapter 2. If you choose to use the default foreign
key, Active Record will find it. Otherwise, you’d have to use the :foreign_key option. The methods and attributes
added through acts_as_tree will use the
foreign key to organize your tree, adding parent and children attributes to your class so each
instance becomes a node of a tree. The root of the tree has a parent
id of nil.

Figure 4-6. The acts_as_tree relationship is recursive, with an entity ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access