1

製品では、メソッドTime.zone.nowは常に同じ値をTime.now返しますが、正しいシステム時刻を返します。

ここに一例があります:

バナー.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 です

理由を知っている人はいますか?

4

1 に答える 1

3

これは、スコープがクラスのロード時に 1 回評価されるためです。

次のように定義する必要があります。

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

このメソッドが呼び出されるたびに再評価されるため、時刻が変更されます。

于 2013-03-08T19:02:07.583 に答える