Найти записи с Datetime, которые соответствуют сегодняшней дате - Ruby on Rails
У меня есть таблица сделок и вам нужно найти записи, в которых дата соответствует сегодняшней дате.
Из консоли rails поле даты, которое нужно совместить, выглядит следующим образом. Я назначил запись для тестирования.
ruby-1.9.2-p0 > deal.start
=> Tue, 10 May 2011 00:00:00 UTC +00:00
Если я попытаюсь найти записи, соответствующие дате начала с сегодняшним днем, я получаю nil
ruby-1.9.2-p0 > Deal.find_by_start(Date.today)
=> nil
то я думал, что смогу совместить, переведя Date.today в datetime.
ruby-1.9.2-p0 > Date.today.to_datetime
=> Tue, 10 May 2011 00:00:00 +0000
ruby-1.9.2-p0 > Deal.find_by_start(Date.today.to_datetime)
=> nil
Как я могу заставить это работать? Я использую Rails 3.
Изменить:
Я думал о преобразовании их обоих в согласованный формат, который будет работать, но не при использовании метода find_by_start
ruby-1.9.2-p0 > deal.start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y")
=> true
ruby-1.9.2-p0 > Deal.find_by_start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y")
NoMethodError: undefined method `strftime' for nil:NilClass
Ответы
Ответ 1
Помните, что DateTime содержит дату и время, поэтому вы ищете записи, которые имеют точное значение, а не только в тот же день.
Вы можете сделать это одним из двух способов. Вы можете выбрать диапазон времени с начала дня до конца или создать столбец date
, чтобы лучше группировать ваши данные.
Версия диапазона выглядит так:
@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all
Другой требует создания нового столбца start_date
в вашей таблице и заполнения его соответствующими датами. Вы можете индексировать эту дату, и ваши запросы выполняются намного быстрее, поскольку выбор диапазона не всегда быстр на больших наборах данных.
Ответ 2
Rails 5.1 ввел Date#all_day
helper, который возвращает объект диапазона для заданной даты, поэтому вы можете просто написать:
Deal.where(start: Date.today.all_day)
Вы также можете использовать функцию SQL DATE()
для своей цели, например:
@deals = Deal.where('DATE(start) = ?', Date.today)
Ответ 3
Для тех, кто еще находится в Rails 4:
Чтобы увеличить ответ not_a_patch выше, я бы использовал:
Deal.where(start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
потому что Time.zone
будет использовать UTC (это то, как хранится ваше поле даты), а DateTime.now
не будет.
> DateTime.now
=> Fri, 08 Sep 2017 11:28:21 -0400
> Time.zone.now
=> Fri, 08 Sep 2017 15:29:53 UTC +00:00