Подтвердить что ты не робот

Найти записи с 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
4b9b3361

Ответ 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