- Understand what scopes are and how they differ from arrays
- Understand how a purely object-oriented approach of dealing with data doesn't scale.
- Get into a habit of off-loading list-related calculations (filtering, mapping) to the database
- Learn about the N+1 query problem and eager loading
- Get into a habit of explicitly resolving scopes to arrays by calling
to_a(don't let it happen by accident)
- Understand the difference between "named scopes" and ad-hoc scopes using
- Understand how the scope creation syntax changed between Rails 2.3 and Rails 3+
Search for MovieDB
In MovieDB, implement a method
Movie.search(query) that returns a scope of movies matching the given query:
- The query is a list of space-separated words that all need to appear in the movie title in order for the movie to match (e. g.
- A word can be prefixed by a minus character to exclude that word (e.g.
Make sure that the returned value is not an array but a scope that can be chained further. E.g. I should be able to use it like this:Copy
Movie.search('event -main').search('horizon').where('year > 1995').order(:year).to_a
- In the MovieDB UI, put a search box over the movies list that is backed by
- Write both a Cucumber scenario and RSpec examples for the search functionality, using the guidelines from the "Testing" chapter in Growing Rails Applications in Practice.
- RSpec examples should cover all edge cases
- Cucumber scenario should only cover one "happy path" to show successful integration
Open budgets in Project Hero (makandra only)
In Project Hero (a Rails 2.3 project), build a view that lists all open budgets with unused amounts.
- First, build it naively by iterating over all projects, iterating over the budgets of each project, etc.
- Ask someone for a dump of the
makandrastage and load it,
tail -f log/development.logand observe the performance of your view. How many MySQL queries does it trigger?
- Now build a version of your view that does the same number of queries regardless of how many projects, budgets, activities, etc. you have.
- When you're done: Can you move your code to a
BudgetReportclass with a nice API?