Различные результаты использования включают в себя? а между? для того же диапазона дат Rails 5 - PullRequest
0 голосов
/ 31 августа 2018

Почему я получаю разные результаты в этих двух запросах?

Запрос 1 = ложь (создание массива идентификаторов смены с последующей проверкой, находится ли идентификатор смены в массиве):

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 (проверка, находится ли сдвиг 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 голосов
/ 01 сентября 2018

date_time это объект String или DateTime? это может быть проблемой.

Поскольку оба объекта String и Datetime принимают метод between?, оба наследуются в конце от Comparable https://apidock.com/ruby/Comparable/between%3F

Строка будет сравниваться буквенно

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

Объект DateTime будет вызывать between? для объектов Time, которые представлены в виде целого числа, и обычно сравнивается

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

Если date_time - это строка, я бы предложил изменить ее на тип столбца DATETIME, это имеет смысл с точки зрения семантики. Если вы не можете изменить его, вы можете добавить собственный метод получения, чтобы он возвращал объект DateTime при разборе строки.

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

Я не настолько знаком с операторами SQL и их оптимизацией, но я предполагаю, что они обычно сравнивают оба, это объясняет, почему работает запрос, а не метод between?. Тем не менее, я не могу подтвердить это, я просто догадываюсь (возможно, это даже зависит от реализации и механизма таблиц, я не знаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...