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

Rails时间对象查询问题:无法返回指定日期的Job数据

嘿,这问题我之前也踩过坑!你遇到的根本问题是ActiveRecord的查询语法用错了,导致你的条件完全没生效,才会出现所有日期显示全部Job、控制台查询结果混乱的情况。咱一步步来解决:

1. 视图里的日期匹配为啥全错了?

你原代码写的是:

<% @jobs.where(:datetime == date.day).each do |job| %>

这里的:datetime == date.day是个Ruby布尔表达式啊!Ruby会先判断符号:datetime和数字date.day(比如16)是否相等——显然永远是false。而ActiveRecord的where(false)理论上返回空,但你说显示全部Job,估计是你不小心写错了符号的写法?不管怎样,正确的思路是匹配完整的日期(年月日),而不是只匹配“日”(不然5月16和6月16会混),而且要按ActiveRecord的规则写查询条件:

两种靠谱的写法:

  • 用日期范围匹配一整天:
    <% @jobs.where(datetime: date.beginning_of_day..date.end_of_day).each do |job| %>
    
  • 用SQL的DATE()函数提取日期部分匹配:
    <% @jobs.where("DATE(datetime) = ?", date.to_date).each do |job| %>
    

2. 控制台查询的问题出在哪?

你执行的:

@jobs.where(:datetime == Time.new("2018-05-16 08:30:00 -0400"))

同样犯了语法错误——:datetime == 时间对象还是个布尔值false,相当于你在查where(false),结果肯定不对。如果你想找当天的所有Job,正确的控制台查询应该是:

# 方式1:用日期范围精准匹配当天
target_date = Time.new("2018-05-16")
@jobs.where(datetime: target_date.beginning_of_day..target_date.end_of_day)

# 方式2:用DATE函数匹配日期部分
@jobs.where("DATE(datetime) = ?", Date.parse("2018-05-16"))

这样就能准确返回id1、3、4那3条5月16号的Job,不会混进22号的。

额外提个优化建议(符合MVC原则)

别在视图里写数据库查询啦!提前在控制器把Job按日期分组,视图直接拿数据就行,既高效又整洁:

控制器代码:

# 把Job按日期分组,key是Date对象,value是当天的Job数组
@jobs_by_date = @jobs.group_by { |job| job.datetime.to_date }

视图代码:

<% # 假设date是@calendar_days里的Time对象 %>
<% (@jobs_by_date[date.to_date] || []).each do |job| %>
  <!-- 这里写Job的展示代码 -->
<% end %>

这样改完,你的日历应该就能正确显示每天对应的Job啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:34