我正在使用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
但是,当我进入搜索页面并重复输入新的搜索字词时,它会开始显示在前十个结果中! (虽然我不希望十大结果在1天过去之前发生变化。)当缓存存储是默认的时候,日志中没有显示任何查询(所以你认为缓存正在工作),当使用dalli / memcached时,我得到了完全一样的结果行为,但在日志中有这个:
Cache read: top_ten_searches_cache ({:expires_in=>1 day})
Cache fetch_hit: top_ten_searches_cache ({:expires_in=>1 day})
Cache fetch_hit
究竟是什么意思?这是否意味着没有找到缓存并且不得不进行查询?
不确定发生了什么 - 奇怪的是我使用默认存储或使用Dalli的memcached获得相同的行为。
答案 0 :(得分: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
请参阅here。