【问题标题】:Why ActiveRecord caches find(:all) between requests?为什么 ActiveRecord 在请求之间缓存 find(:all)?
【发布时间】:2012-06-13 22:56:52
【问题描述】:

我的控制器中有这个:

def frontpage
  @sections = Section.all
end

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

【问题讨论】:

  • 你如何确定查询被缓存了?

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


【解决方案1】:

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

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

至少它应该可以解决问题

e:这样做的好处是它只影响块内的代码。其他所有内容仍应被缓存。

【讨论】:

    【解决方案2】:

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

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

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

    然后看看它的变化。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        相关资源
        最近更新 更多