【问题标题】:Different outcomes using include? and between? for same date range Rails 5使用包括不同的结果?和之间?对于相同的日期范围 Rails 5
【发布时间】: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


【解决方案1】:

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 是字符串,我建议将其更改为 DATETIME 列类型,这在语义上更有意义。如果不能改,可以添加自定义getter,返回解析字符串的DateTime对象。

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

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

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多