【发布时间】:2018-08-31 15:39:15
【问题描述】:
为什么我在这两个查询中得到不同的结果?
Query 1 = false(创建班次 ID 数组,然后检查班次 ID 是否在数组中):
shifts = Shift.where('date_time BETWEEN ? AND ?', Time.zone.now - 3.hours, Time.zone.now + 24.hours).pluck(:id)
shifts.include?(16923) # false
Query 2 = true(检查 shift date_time 是否在时间范围内):
Shift.find(16923).date_time.between?(Time.zone.now - 3.hours, Time.zone.now + 24.hours) # true
属性date_time是一个字符串,和它有什么关系吗?
在撰写本文时,以下是当前结果:
Shift.find(16923).date_time = "2018-09-01T07:45:00+00:00"
Time.zone.now - 3.hours = Fri, 31 Aug 2018 13:34:07 BST +01:00
Time.zone.now + 24.hours = Sat, 01 Sep 2018 16:35:22 BST +01:00
在我看来它在这两个范围之间,那么为什么它不包含在第一个数组中?
【问题讨论】:
-
正在生成的查询是什么样的?
Shift.where('date_time BETWEEN ? AND ?', Time.zone.now - 3.hours, Time.zone.now + 24.hours).to_sql? -
"SELECT \"shifts\".* FROM \"shifts\" WHERE (date_time BETWEEN '2018-08-31 15:05:13.583913' AND '2018-09-01 18:05: 13.590677')"
-
看起来不错...也许 id 列是一种奇怪的类型(例如字符串)?您可能会遇到更好的运气:
shift = Shift.where('date_time BETWEEN ? AND ?', Time.zone.now - 3.hours, Time.zone.now + 24.hours).find_by(:id => 16923)在执行以下操作时是否手动确认 id 存在:puts Shift.where('date_time BETWEEN ? AND ?', Time.zone.now - 3.hours, Time.zone.now + 24.hours).pluck(:id).sort? -
ID 不在
Shift.where('date_time BETWEEN ? AND ?', Time.zone.now - 3.hours, Time.zone.now + 24.hours).pluck(:id)呈现的列表中,这就是我正在努力解决的问题...我不明白为什么一个查询在两者都使用看似相同的参数。
标签: ruby-on-rails ruby-on-rails-5