You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails中筛选过期时间小于20天的Shift数据?

Rails 中获取20天内即将过期的Shift数据

你的问题出在条件判断的方向和时间取值上:原代码使用20.days.ago会筛选出过期时间早于20天前的记录(也就是已经过期超过20天的数据),而你需要的是未来20天内即将过期的数据,需要调整时间取值和条件逻辑。

修正后的Scope代码

根据需求的不同,有两种常见场景:

场景1:仅筛选未过期、且将在未来20天内过期的数据

scope :expiring_within_20_days, -> { where(expiry_date: Time.current..20.days.from_now) }

这个scope会返回expiry_date在当前时间到20天后之间的记录,也就是还没过期,但剩余有效期不足20天的Shift。

场景2:筛选已过期但不超过20天,加上未来20天内即将过期的数据

如果你的需求包含“已经过期但过期时间不超过20天”的记录,可以这样写:

scope :expiring_or_expired_within_20_days, -> { where(expiry_date: 20.days.ago..20.days.from_now) }

代码说明

  • Time.current:Rails推荐的获取当前时间的方法(会自动处理时区),比Time.now更可靠。
  • 20.days.from_now:获取20天后的时间,作为过期时间的上限。
  • 范围查询where(expiry_date: start_time..end_time)是Rails中更简洁安全的写法,会自动生成正确的SQL条件,避免手动拼接字符串可能带来的SQL注入风险。

原代码错误解析

原代码where('expiry_date < ?', 20.days.ago)的逻辑是:筛选expiry_date早于20天前的记录,也就是这些Shift已经过期超过20天了,和你的需求完全相反。

内容的提问来源于stack exchange,提问作者user12763413

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:31:16