Time.zone.now锁定在生产中

时间:2013-03-08 18:56:16

标签: ruby-on-rails ruby ruby-on-rails-3

在产生时,方法Time.zone.now总是在Time.now返回时返回相同的值 正确的系统时间。

这里有一个例子:

banner.rb

scope :active, where("'#{Time.zone.now}' between start_date and end_date")

此范围的日志:

SELECT `banners`.* FROM `banners` WHERE ('2013-03-06 08:06:46 -0300' between start_date and end_date) AND ((`banners`.`store_id` = 1 AND `banners`.`spot_id` = 3 AND `banners`.`at_home` = 1))

Time.zone.now始终 2013-03-06 08:06:46 -0300

任何人都知道为什么?

1 个答案:

答案 0 :(得分:3)

这是因为在加载类时,范围会被评估一次。

您应该像这样定义:

def self.active
  where("'#{Time.zone.now}' between start_date and end_date")
end

每次调用此方法时,都会重新评估它,因此时间会发生变化。