Rails.cache - 工作但不工作

A4J*_*A4J 2 memcached ruby-on-rails ruby-on-rails-3 dalli

我正在使用Rails.cache(我已尝试使用dalli gem的默认存储和memcached - 但我得到相同的行为)它似乎正在工作,但不是(日志显示查询未生成,但实际结果另外显示)...我有一个搜索页面缓存前十个查询1天:

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 
Run Code Online (Sandbox Code Playgroud)

但是,当我进入搜索页面并重复输入新的搜索词时,它开始显示在前十个结果中!(虽然我不希望十大结果在1天过去之前发生变化.)当缓存存储是默认的时候,日志中没有显示任何查询(所以你认为缓存正在工作),当使用dalli/memcached时,我得到的完全相同行为,但在日志中有这个:

Cache read: top_ten_searches_cache ({:expires_in=>1 day})
Cache fetch_hit: top_ten_searches_cache ({:expires_in=>1 day})
Run Code Online (Sandbox Code Playgroud)

究竟Cache fetch_hit是什么意思?这是否意味着没有找到缓存并且必须进行查询?

不确定发生了什么 - 奇怪的是,我使用默认存储或使用Dalli的memcached获得相同的行为.

Mik*_*ell 12

您正在缓存范围,而不是查询的实际结果.Rails使用延迟加载,因此要强制查询执行,您需要放置.to_a(或.all在Rails 3中),例如:

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 
Run Code Online (Sandbox Code Playgroud)

看到这里.