如何在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
相关产品推荐
相关产品推荐

