为什么ActiveRecord缓存在请求之间找到(:all)?

时间:2012-06-10 23:51:08

标签: ruby-on-rails postgresql caching activerecord rails-postgresql

我在控制器中有这个:

def frontpage
  @sections = Section.all
end

在生产环境中,查询似乎在请求之间缓存。在我重新启动应用之前,@sections始终是相同的。为什么以及如何解决此问题?我还要提一下,我在制作中使用Postgres,可能是原因吗?

3 个答案:

答案 0 :(得分:1)

我相信在您的生产环境中,您已在某处启用了缓存。虽然我无法告诉你原因和地点,但我可以给你一个解决方案:

def frontpage
    uncached do
        @sections = find(:all)
    end
end

至少它应该做的伎俩

e:这样做的好处是它只会影响块内的代码。其他所有东西都应该被缓存。

答案 1 :(得分:0)

请求之间不会缓存查询,但可以执行操作。您是否在控制器中定义了cache_action或其他缓存机制?

编辑:要确定这是否是您正在缓存的操作,请将其放入您的操作中:

def frontpage
  return render :text => Time.now.to_s
  ...
end

看到它发生了变化。

答案 2 :(得分:0)

从相关问题中查看this answer。如果你的配置设置为缓存,那么你应该关闭它(至少在开发中。)否则,如果你想使特定页面的缓存无效,你可以考虑在你的控制器中定义一个方法:

private
def invalidate_cache
     Rails.cache.delete("/sections")
end

您需要指定何时调用它,但它可以解决问题。