Skip to main content

Rails Snippet: Caching expensive calls

·166 words·1 min· ·
General RubyOnRails Ruby Rails Snippet
Ariejan de Vroom
Author
Ariejan de Vroom
Jack of all Trades, Professional Software Craftsman

In Rails, from time to time, you may encounter you have a method you call several times, but which returns always the same result. For example, have the following:

class Person < ActiveRecord::Base
  has_many :articles

  def get_approved_articles
    self.articles.find(:all, :conditions => {:approved => true}, :order => 'approved_on DESC')
  end
end

A query is fired every time you call Person#get_approved_articles. To cache the result of the query during this request, just add a bit of magic

class Person < ActiveRecord::Base
  has_many :articles

  def get_approved_articles
    @approved_articles ||= self.articles.find(:all, :conditions => {:approved => true}, :order => 'approved_on DESC')
  end
end

This will return the @approved_articles value if it exists. If it doesn’t, which is the first time you access the method, the query is run and stored in @approved_articles for later use.

Note: I know it’s much easier to define this kind of behaviour, but it’s just an illustration.

class Person < ActiveRecord::Base
  has_many :articles
  has_many :approved_articles, :class_name => "Article", :conditions => {:approved => true}, :order => 'approved_on DESC'
end

Related

RailsJobs.nl - Ruby on Rails Jobs in The Netherlands
·175 words·1 min
General Blog Ruby Ruby on Rails Rails Jobs RailsJobs.nl
Using Iconv to convert UTF-8 to ASCII (on Linux)
·207 words·1 min
General RubyOnRails Features Ruby
Action Mailer: All mail comes from MAILER DAEMON
·122 words·1 min
General RubyOnRails Features Ruby