如何使Heroku缓存名称作用域同时返回最新结果



看起来像是Heroku缓存范围结果,我的问题是他们如何决定何时缓存、何时刷新范围结果以及如何正确使用范围。在我的代码中,我有一个问题模型的名称范围,如下面的

class Question < ActiveRecord::Base
  scope :today, where('show_date = ?', Time.now.localtime("-07:00").strftime("%Y-%m-%d"))  
end

它总是开始给我相同的缓存结果。我的猜测是,如果我更改问题数据,结果可能会更新。一个快速的研究给了我一个相关的主题:Heroku上的缓存命名范围?。

我已经将代码更改为:

class Question < ActiveRecord::Base
  def self.today
    today_string = Time.now.localtime("-07:00").strftime("%Y-%m-%d");
    where('show_date=?', today_string)                                                                                                                 
  end
end

我想这会一直给我正确的结果,没有任何缓存。但我仍然想知道,在获得正确结果的同时,是否有更好的方法可以从范围缓存中获益?谢谢

作用域是在首次加载应用程序时设置的,因此在第一种情况下,您的作用域查询将固定为当时的日期,直到应用程序因任何原因重新启动。这里缓存的是查询定义,而不是查询结果。一般来说,如果您的范围中有一个依赖于时间的条件,那么您需要使用lambda来将查询定义包装在您的范围内,例如:

class Question < ActiveRecord::Base
  scope :today, lambda { where('show_date = ?', Time.now.localtime("-07:00").strftime("%Y-%m-%d")) }
end

这将缓存作用域定义,但每次调用lambda时都会执行它的主体。它不会缓存查询的结果。

最新更新