Question

I am using Rails.cache (I have tried both default store and memcached with the dalli gem - but I get the same behaviour) it seems to be working, but isn't (logs show that the query is not made, but actual results show otherwise)... I have a search page that caches the top ten queries for 1 day:

search.rb

  def self.top_ten
    Rails.cache.fetch("top_ten_searches_cache", :expires_in => 1.day) do
      Search.order("count DESC").limit(10)
    end    
  end 

However, when I go to the search page, and enter a new search term, repeatedly, it begins to show in the top ten results! (Whereas I am not expecting the top ten results to change until 1 day passes.) When the cache store is default, no query shows in the log (so you think cache is working) and when using dalli/memcached I get exactly the same behaviour, but with this in the log:

Cache read: top_ten_searches_cache ({:expires_in=>1 day})
Cache fetch_hit: top_ten_searches_cache ({:expires_in=>1 day})

What does Cache fetch_hit mean exactly? Could it mean that no cache was found and is having to do the query?

Not really sure what's going on - it's odd that I get the same behaviour with either the default store or memcached with Dalli.

Was it helpful?

Solution

You're caching the scope, not the actual results of the query. Rails uses lazy loading, so to force the query to execute you need to put .to_a (or .all in Rails 3), for example:

def self.top_ten
  Rails.cache.fetch("top_ten_searches_cache", :expires_in => 1.day) do
    Search.order("count DESC").limit(10).to_a
  end    
end 

See here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top