Rails Snippet: Caching expensive calls
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
If you enjoyed this post, please consider to leave a comment or subscribe to the feed and get future articles delivered to your feed reader.






Comments
No comments yet.
Leave a comment