41 lines
1.4 KiB
Markdown
41 lines
1.4 KiB
Markdown
|
---
|
||
|
title: "Rails Snippet: Caching expensive calls"
|
||
|
kind: article
|
||
|
slug: rails-snippet-caching-expensive-calls
|
||
|
created_at: 2008-04-09
|
||
|
tags:
|
||
|
- General
|
||
|
- RubyOnRails
|
||
|
- Ruby
|
||
|
- Rails
|
||
|
- snippet
|
||
|
---
|
||
|
|
||
|
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:
|
||
|
|
||
|
<pre lang="ruby">class Person < ActiveRecord::Base
|
||
|
has_many :articles
|
||
|
|
||
|
def get_approved_articles
|
||
|
self.articles.find(:all, :conditions => {:approved => true}, :order => 'approved_on DESC')
|
||
|
end
|
||
|
end</pre>
|
||
|
|
||
|
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
|
||
|
|
||
|
<pre lang="ruby">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</pre>
|
||
|
|
||
|
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.
|
||
|
|
||
|
<pre lang="ruby">class Person < ActiveRecord::Base
|
||
|
has_many :articles
|
||
|
has_many :approved_articles, :class_name => "Article", :conditions => {:approved => true}, :order => 'approved_on DESC'
|
||
|
end</pre>
|