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

