0.01
Repository is archived
No commit activity in last 3 years
No release in over 3 years
DataMapper plugin allowing the creation of nested sets from data models
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 1.6.4
~> 0.9.2
~> 1.3.2

Runtime

~> 1.2.0
 Project Readme

dm-is-nested_set¶ ↑

DataMapper plugin allowing the creation of nested sets from data models. Provides all the same functionality as dm-is-tree, plus tons more! Read on.

What is a nested set?¶ ↑

Nested set is a clever model for storing hierarchical data in a flat table. Instead of (only) storing the id of the parent on each node, a nested set puts all nodes in a clever structure (see Example below). That is what makes it possible to get the all of the descendants (not only immediate children), ancestors, or siblings, in one single query to the database.

The only downside to nested sets (compared to trees] is that the queries it takes to know these things, and to move nodes around in the tree are rather complex. That is what this plugin takes care of (+ lots of other neat stuff)!

Nested sets are a good choice for most kinds of ordered trees with more than two levels of nesting. Very good for menus, categories, and threaded posts.

Installation¶ ↑

Download and install the latest dm-more-gem. Remember to require it!

Getting started¶ ↑

Coming

Traversing the tree¶ ↑

Coming

Moving nodes¶ ↑

Coming

Example of a nested set¶ ↑

We have a nested menu of categories. The categories are as follows:

-Electronics

- Televisions
  - Tube
  - LCD
  - Plasma
- Portable Electronics
  - MP3 Players
  - CD Players

In a nested set, each of these categories would have ‘left’ and ‘right’ fields, informing about where in the set they are positioned. This can be illustrated:

_____________________________________________________________________________

| _ __ | | | __ _ __ | | _ _ | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 CD- 14 15 16 | | | Tube | | LCD | | Plasma | | | | MP3 Players | | Players | | | | | |__| |_| |__| | | |_| |_| | | | | | | | | | | Televisions | | Portable Electronics | | | |_| |__| | | | | Electronics | |_|

All sets has a left / right value, that just says ‘here do I start’, and ‘here do I end’. The category ‘Televisions’ starts at 2, and ends at 9. We then know that all descendants of ‘Televisions’ reside between 2 and 9. Whats more, we can see all categories that does not have any subcategory, by checking if their left and right value has a gap between them. Clever huh?

Now, if we want to insert the category ‘Flash’ into ‘MP3 Players’, the new set and left/right values would now be:

_____________________________________________________________________________

| __ | | _ | _ | | | | __ _ __ | | | _ | _ | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 Flash 13 14 15 CD- 16 17 18 | | | Tube | | LCD | | Plasma | | | | |_| | | Players | | | | | |__| |_| |__| | | | | |_| | | | | | | | MP3 Players | | | | | Televisions | | |_| Portable El. | | | |_| |__| | | | | Electronics | |_|

More about nested sets¶ ↑