1

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

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

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

我已经将代码更改为:

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

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

4

1 回答 1

3

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

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

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

于 2012-08-05T09:41:45.103 回答