gpt4 book ai didi

ruby-on-rails - 将 Timecop gem 用于范围

转载 作者:数据小太阳 更新时间:2023-10-29 07:02:05 24 4
gpt4 key购买 nike

我在 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 可能影响的背景下评估今天的人。

谢谢!

最佳答案

这是一个非常常见的错误。正如您在范围中所写的那样,日期是加载代码时的日期。如果您在生产环境中运行此代码,只有在您重新启动应用程序时才会重新加载代码(不同于在每次请求时重新加载代码的开发环境),您会在重新启动应用程序的那天得到正确的结果,但第二天结果一天前出,后天出 2 天等等。

像这样定义作用域的正确方法是

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

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

关于ruby-on-rails - 将 Timecop gem 用于范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8855017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com