Rails Time.now,显示时间服务器启动而非实际时间

时间:2010-06-24 20:39:04

标签: ruby-on-rails

我以前见过这个问题,但我不知道如何解决它。

说我有:

class Notification < ActiveRecord::Base
  scope :current_notifications, where("starts_at <= ?", Time.now).where("ends_at >= ?", Time.now).limit(1)
end

因此范围是从服务器启动的时间开始计算的,有关如何修复此类实例的任何想法吗?

2 个答案:

答案 0 :(得分:9)

你需要一个lambda。 (这会创建一个匿名方法,Rails会在每次调用范围时调用它。)

class Notification < ActiveRecord::Base
  scope :current_notifications, lambda {
    now = Time.now
    where("starts_at <= ?", now).where("ends_at >= ?", now).limit(1)
  }
end

答案 1 :(得分:0)

开发时,每个请求都会重新加载模型。在生产时,它们被缓存,因此范围将引用Time.now,就像模型首次加载到内存中一样。

使用lambda表达式绕过它。每次使用范围时,都会评估lambda表达式。

您还可以使用命名参数稍微干掉您的关系以删除重复的Time.now,如下所示:

scope :current_notifications, lambda do
  where("starts_at <= :now or ends_at >= :now", now: Time.now).limit(1)
end