繁体   English   中英

使用Timecop gem for Scopes

[英]Using Timecop gem For Scopes

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

class DrawingList < ActiveRecord::Base
  scope :active_drawings, where('start_date <= ? AND end_date >= ?', Date.today, Date.today)
end

在我的规范中,我想做:

before do
  @list = DrawingList.create #things that include begin and end dates
end

it "doesn't find an active drawing if they are out of range" do
  pending "really need to figure out how to work timecop in the presence of scopes"
  Timecop.travel(2.days)
  puts Date.today.to_s
  DrawingList.active_drawings.first.should be_nil
end

正如您可能想象的那样,看跌期权真的表明Date.today是两天。 但是,范围是在不同的上下文中进行评估的,因此它使用旧的“今天”。 今天如何在Timecop可以影响的上下文中进行评估。

谢谢!

这是一个非常常见的错误。 正如您在范围使用的日期所写的那样,是加载代码时的日期。 如果你重新启动应用程序(不像每次请求重新加载的开发),你是否只在重新加载代码的生产中运行它,你会在重新启动应用程序的那天获得正确的结果,但第二天结果将在一天之内,第二天之后出现等等。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM