Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对作用域使用Timecop gem_Ruby On Rails_Ruby_Date_Rspec - Fatal编程技术网

Ruby on rails 对作用域使用Timecop gem

Ruby on rails 对作用域使用Timecop gem,ruby-on-rails,ruby,date,rspec,Ruby On Rails,Ruby,Date,Rspec,我在Rails 3.0应用程序中指定了一个作用域,如下所示: class DrawingList < ActiveRecord::Base scope :active_drawings, where('start_date <= ? AND end_date >= ?', Date.today, Date.today) end 正如你所想象的,看跌期权确实显示了那个日期。今天是两天后。但是,范围是在不同的上下文中评估的,因此它使用旧的“今天”。在Timecop可能影响的环

我在Rails 3.0应用程序中指定了一个作用域,如下所示:

class DrawingList < ActiveRecord::Base
  scope :active_drawings, where('start_date <= ? AND end_date >= ?', Date.today, Date.today)
end
正如你所想象的,看跌期权确实显示了那个日期。今天是两天后。但是,范围是在不同的上下文中评估的,因此它使用旧的“今天”。在Timecop可能影响的环境中,如何评估一个人的今天


谢谢

这是一个非常常见的错误。正如您在中所写,作用域使用的日期是加载代码时的日期。如果你在生产环境中运行这个程序,只在你重新启动应用程序时才会重新加载代码(不像开发环境中每次请求都会重新加载代码),那么在你重新启动应用程序的那天,你会得到正确的结果,但第二天,结果会在一天内出来,第二天会出来2天等等

定义这样的范围的正确方法是

scope :active_drawings, lambda { where('start_date <= ? AND end_date >= ?', Date.today, Date.today)}
scope:active_图形,lambda{where('start_date=?',date.today,date.today)}

lambda确保每次使用范围时都对这些日期进行评估。

这是一个非常棘手的问题!谢谢我很高兴我现在意识到了这种行为。
scope :active_drawings, lambda { where('start_date <= ? AND end_date >= ?', Date.today, Date.today)}