When fetching all associations with includes they are not cached, but could be, since they are still the same records(unlike with :select/:conditions etc)
user = User.first user.comments.length # hits db user.comments.length # cached user = User.first user.commens.all(:include=>:comenter).length # hits db user.commens.all(:include=>:comenter).length # hits db user.comments.length # hits db
Cached find all with includes
This can save requests when performing repetitive calls to the same record.
user = User.first user.comments.load_target_with_includes([:commenter, :tags]).length # hits db user.comments.load_target_with_includes([:commenter, :tags]).length # cached user.comments.length # cached
Code
# do not load an association twice, when all we need are includes # all(:include=>xxx) would always reload the target class ActiveRecord::Associations::AssociationCollection def load_target_with_includes(includes) raise if @owner.new_record? if loaded? @target else @loaded = true @target = all(:include => includes) end end end