1

本番環境のスコープが現在の時刻を反映していないという奇妙なエラーがあります。

module TimeFilter
  # Provides scopes to filter results based on time.
  def self.included(base)
    base.extend(ClassMethods)
    base.class_eval do
      scope :today, where(end_time: Time.zone.now.midnight..Time.zone.now)
      scope :this_week, where(end_time: Time.zone.now.beginning_of_week..Time.zone.now)
      scope :this_month, where(end_time: Time.zone.now.beginning_of_month..Time.zone.now)
      scope :older_than_this_month, where("end_time < ?", Time.zone.now.beginning_of_month)
      scope :last_month, where(end_time: Time.zone.now.beginning_of_month..Time.zone.now.beginning_of_month - 1.month)
    end
  end
end

Time.zone.nowは、レールコンソールと同じ時間のようです。

ライブラリからモデルにスコープを移動すると、問題なく機能します。私は何か間違ったことをしていますか?

4

1 に答える 1

1

はい、スコープはで一度評価されていclass_evalます。この問題を修正するには、次のようにスコープにラムダを使用します。

  scope :today, lambda {where(end_time: Time.zone.now.midnight..Time.zone.now)}
  scope :this_week, lambda {where(end_time: Time.zone.now.beginning_of_week..Time.zone.now)}
  scope :this_month, lambda {where(end_time: Time.zone.now.beginning_of_month..Time.zone.now)}
  scope :older_than_this_month, lambda {where("end_time < ?", Time.zone.now.beginning_of_month)}
  scope :last_month, lambda {where(end_time: Time.zone.now.beginning_of_month..Time.zone.now.beginning_of_month - 1.month)}

これにより、evalが呼び出されたときではなく、実際のスコープが呼び出されたときに時間が評価されます。

于 2013-03-14T21:02:51.350 に答える