使用不同的结果包括?和之间?相同日期范围的Rails 5

时间:2018-08-31 15:39:16

标签: ruby-on-rails ruby-on-rails-5

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

查询1 =否(创建班次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 =真(检查轮班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

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

1 个答案:

答案 0 :(得分:0)

date_time是String还是DateTime对象?可能是问题所在。

因为String和Datetime对象都接受between?方法,它们都从可比https://apidock.com/ruby/Comparable/between%3F的结尾处继承

将对字符串进行算术比较

'11'.between?('0','2') # => true

DateTime对象将对以整数表示的Time对象调用between?,并且通常会对其进行比较

11.between?(0,2) # => false

如果date_time是一个字符串,我建议将其更改为DATETIME列类型,从语义上讲更有意义。如果无法更改,则可以添加一个自定义的getter方法以返回解析该字符串的DateTime对象。

def date_time
  DateTime.parse(self[:date_time])
end

我并不熟悉SQL运算符及其优化,但是我猜想它通常将两者进行比较,这可以解释为什么查询有效,而不是between?方法。我仍然无法确定这一点,我只是在猜测(也许我什至不知道它甚至取决于实现和表引擎)。