使用包含的不同结果?之间?对于相同的日期范围Rails 5

问题描述 投票:2回答:1

为什么我在这两个查询中得到不同的结果?

查询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

在我看来它是在这两个范围之间,为什么它不包含在第一个数组中?

ruby-on-rails ruby-on-rails-5
1个回答
0
投票

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?方法。我仍然无法证实这一点,我只是猜测(也许它甚至取决于实现和表引擎,我不知道)。

© www.soinside.com 2019 - 2024. All rights reserved.