Just to remember how easly You can cache particular method in your model.
We have some nasty method, which generates many queries to DB
in Category model:
def popular_subcategories_db
self.leaves.map{|l| [l.sales_profiles.size, l.name]}.sort.reverse[0..2].map{|subc| "#{subc[1]}"}.join(' — ')
end
so we make a getter for it:
def popular_subcategories
Rails.cache.fetch("popular_subcategories_db_#{self.id}") { popular_subcategories_db }
end
Now, in log after first reqest we can see:
Cache miss: popular_subcategories_db_4 ({})
[4;35;1mCategory Load (0.000000)[0m [0mSELECT * FROM "categories" WHERE (1 = 1 AND (lft BETWEEN 345 AND 354) AND lft + 1 = rgt) ORDER BY lft[0m
[4;36;1mSQL (0.000000)[0m [0;1mSELECT count(*) AS count_all FROM "sales_profiles" WHERE ((sales_profiles.category_id = 208)) [0m
[4;35;1mSQL (0.000000)[0m [0mSELECT count(*) AS count_all FROM "sales_profiles" WHERE ((sales_profiles.category_id = 228)) [0m
Cache write (will save 0.03100): popular_subcategories_db_4
after another one, we get only:
Cache hit: popular_subcategories_db_4 ({})
Nice!
taken from http://railscasts.com/episodes/115
EDIT: I found that when You cache ActiveRecord models, retrieved with complicated queries with joins, some of their association methods are missing after read from cache. !