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 inspirating 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.
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:
A | B | (M) / \ C D / \ F E
In the tree above I can see:
- the current movie
Mwas inspired by
Bwas inspired by
Ahas no recorded inspiration
Dwere inspired by
Ewere inspired by
Note that the user should see the same, complete tree no matter which movie in the structure she is currently viewing.
Look at your development log while opening a movie. How many queries are triggered?
- Read about different patterns for storing trees in databases.
- Migrate from
Movie#inspiration_idto the materialized path pattern using the ancestry gem.
- 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?