eager loading and lazy loading in rails
Eager loading
Pro: is that everything's ready to go.
Con: you are using up space/memory.
Lazy Loading
An anecdote might help you remember:
A young naval cadet asked Lord Nelson why he wasn't preparing his ships:
"I won't load my guns early.......I'll load just 1 microsecond before I need to fire it." he said. "I'm being lazy. I prefer doing it at the last minute, just like with my university assignments etc."
Pro of lazy loading: you don't hit the database until you need to.
Con: You'll be hitting the database N + 1 times.....unless you select exactly the column you want and you alias it. e.g.
@products = Product.order("categories.name").joins(:category)
Hitting the Database only once with a lazy loading policy:
The above query hits the database N + 1 times when you call product.category.name
in the view template - where product is a single object within the @products
relation. But if you alias it, you can get everything done with just one query:
@products = Product.order("categories.name").joins(:category).select("products.*, categories.name as category_name")
And use it like this: product.category_name
Eager Loading
One way to improve performance is to cut down on the number of SQL queries. You can do this through eager loading.
User.find(:all, :include => :friends)
Here you are firing only two queries :
1) One for all users.
2) One for all friends of users .
Lazy Loading :
When you have an object associated with many objects like a User has many Friends and you want to display a list as in Orkut you fire as many queries as there are friends, plus one for the object itself.
users = User.find(:all)
Then query for each user friend , like :
users.each do |user|
friend = Friend.find_by_user_id(user.id)
end
Here
1) One query for all users.
2) N query for N no. of users friends .
Take a look on : Rails 3: Lazy loading versus eager loading
Hope that will help you to understand this .