To my surprise, Post.all in Rails 3 performs the query immediately. It does not do lazy loading, as Arel’s where method does.
def index @posts = Post.all # not lazy; returns Array end
It turns out this is by design. See Force loading – all, first & last.
So: what do you use if your view has fragment caching and you want your controller’s index method to delay the query until you’re sure you’ll need to use it?
At first I did this:
def index @posts = Post.where('1=1') # returns ActiveRecord::Relation end
But the documented way is to use the scoped method:
def index @posts = Post.scoped # returns ActiveRecord::Relation end
Another alternative I recommend, which lets you do lazy execution queries in any version of Rails: move the queries to helper methods.