gpt4 book ai didi

ruby-on-rails - rails 范围内的时区独立到期日比较

转载 作者:行者123 更新时间:2023-11-29 14:08:57 24 4
gpt4 key购买 nike

考虑以下情况。我有一个带有日期时间 activation_due_date 字段的 Voucher 模型和一个包含关于他的位置(时区、UTC 偏移)的最新信息的用户模型。
我想检查他是否在任何可用时区的到期日之前请求激活优惠券。例如,如果截止日期设置为 28.08.2018 23:59 UTC我希望我的范围 before_activation_due 检查他是否在他当前时区的 28.08.2018 - 23:59 之前请求某些东西,所以我的截止日期不是固定的 - 这取决于用户位置 - 在一个地方它可以在截止日期之后,另一个在截止日期之前。
我尝试了以下方法。

models/voucher.rb

scope :before_activation_due, lambda { |user|
where('activation_due_date > ? ', Time.current.to_utc + user.utc_offset)
}

我的问题是:

  1. 这是正确的方法吗?如果不是,处理此类情况的正确方法是什么?

  2. 如何测试这样的范围?当前时间戳可能是在查询执行期间比较日期时间时从数据库服务器获取的,所以我不确定如何在我的规范中模拟它。

提前致谢。

最佳答案

您可以只存储用户的时区,而不是偏移量,然后执行:

where('activation_due_date > ? ', Time.now.utc.in_time_zone(user.timezone))

其中时区是

中显示的任何有效时区
rake time:zones

至少这会是更符合 Rails 风格的做事方式。但我不认为存储偏移量然后手动将其添加到时间是一种糟糕的方法。

要对此进行测试,您可以手动将您想要的任何日期插入到数据库中。然后你可以使用像 https://github.com/travisjeffery/timecop 这样的 gem及时旅行到那个点,并测试你的范围:

Voucher.create(activation_due_date: '2018-01-02 00:00:00')
format = '%Y-%m-%d %H:%M:%S %Z'
time = DateTime.strptime("2018-01-02 00:00:00 Central Time (US & Canada)",format)
Timecop.travel(time)
Voucher.before_activation_due.all ...

关于ruby-on-rails - rails 范围内的时区独立到期日比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020181/

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