为什么我在这两个查询中得到不同的结果?
查询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
查询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
在我看来它是在这两个范围之间,为什么它不包含在第一个数组中?
date_time
是String还是DateTime对象?这可能是问题所在。
因为String和Datetime对象都接受between?
方法,所以两者都从Comparable https://apidock.com/ruby/Comparable/between%3F继承
字符串将进行比较
'11'.between?('0','2') # => true
DateTime对象将在Time对象上调用between?
,该对象表示为整数并且它被比较
11.between?(0,2) # => false
如果date_time
是一个String,我建议将它改为DATETIME列类型,它在语义上更有意义。如果无法更改它,可以添加自定义getter以返回解析字符串的DateTime对象。
def date_time
DateTime.parse(self[:date_time])
end
我不是那些熟悉SQL运算符的人,而是它的优化,但我猜它是普遍的比较,这可以解释为什么查询有效而不是between?
方法。我仍然无法证实这一点,我只是猜测(也许它甚至取决于实现和表引擎,我不知道)。