Ruby on rails 对于单个请求或代码块,如何绕过Rails.cache?

Ruby on rails 对于单个请求或代码块,如何绕过Rails.cache?,ruby-on-rails,ruby,caching,activesupport,Ruby On Rails,Ruby,Caching,Activesupport,我有一个API端点,它从利用Rails.cache的代码中聚合了一组数据,在这里和那里收集了少量数据。然而,有时我需要100%的最新数据,就好像Rails.cache是空的一样。显然,我可以在聚合数据之前清除缓存,但这会影响不相关的数据和请求 有没有一种方法可以让rails中的请求看起来像rails.cache是空的,类似于rails.cache被配置为:null\u store ActiveRecord中的查询缓存有类似的功能—一个“uncached”函数,您可以将块传递给它,块将在不启用查询

我有一个API端点,它从利用Rails.cache的代码中聚合了一组数据,在这里和那里收集了少量数据。然而,有时我需要100%的最新数据,就好像Rails.cache是空的一样。显然,我可以在聚合数据之前清除缓存,但这会影响不相关的数据和请求

有没有一种方法可以让rails中的请求看起来像rails.cache是空的,类似于rails.cache被配置为:null\u store


ActiveRecord中的查询缓存有类似的功能—一个“uncached”函数,您可以将块传递给它,块将在不启用查询缓存的情况下运行。我需要类似的东西,但通常是针对Rails.cache。

由于似乎没有现成的解决方案,我通过添加以下代码作为config/initializers/Rails\u cache.rb来编写自己的解决方案

module Rails
  class << self
    alias :default_rails_cache :cache
    def cache
      # Allow any thread to override Rails.cache with its own cache implementation.
      RequestStore.store[:rails_cache] || default_rails_cache
    end
  end
end
如果您想完全关闭此线程的缓存,可以:null\u store而不是:memory\u store


如果您不使用请求存储gem,“RequestStore.store”可以替换为“Thread.current”以获得相同的效果-只需更加小心跨请求的线程重用。

您首先使用哪个Rails api来缓存数据?我使用的是Rails 3.2.17。缓存是Rails gem中Rails.rb中定义的标准Rails.cache。
RequestStore.store[:rails_cache] = ActiveSupport::Cache.lookup_store(:memory_store)