Storing a tree
For each movie in MovieDB, we want to track which other movie it was inspired by. For example:
- "Interstellar was inspired by 2001"
 - "Inception was inspired by The Matrix"
 
Start by adding a field Movie#inspiration_id. In the movie form, I should be able to select the inspiring movie.
The list should:
- include all the movies that were released in previous years
 - not include the movie itself
 - not include a movie that was itself inspired by the movie that is being edited.
 
Traversal
In the movie show view, I want to see the "inspiration tree" of that movie.
An inspiration tree for a movie M could look like this:
stateDiagram-v2
    M: (M)
    A --> B
    B --> M
    M --> C
    M --> D
    D --> F
    D --> E
In the tree above I can see:
- the current movie 
Mwas inspired byB - 
Bwas inspired byA - 
Ahas no recorded inspiration - 
CandDwere inspired byM - 
FandEwere inspired byD 
Note that if an ancestor B has inspired other movies than the current movie M, we do not need to display it.
Look at your development log while opening a movie. How many queries are triggered?
Materialized path
- Read about different patterns for storing trees in databases.
 - Migrate from 
Movie#inspiration_idto the materialized path pattern using the ancestry gem Show archive.org snapshot . - Make sure that you write a proper migration for existing movies.
 - Reduce the number of queries for the inspiration tree view to 2.
 - Look at the queries that 
ancestryis triggering. How does it work? 
Posted by Henning Koch to makandra Curriculum (2015-09-04 15:42)