Найти записи с Datetime, которые соответствуют сегодняшней дате - Ruby on Rails - PullRequest
28 голосов
/ 10 мая 2011

У меня есть таблица предложений, и мне нужно найти записи, в которых дата соответствует сегодняшней дате.

В консоли rails поле даты, которое мне нужно сопоставить, выглядит следующим образом.Я назначил запись для тестирования.

ruby-1.9.2-p0 > deal.start
=> Tue, 10 May 2011 00:00:00 UTC +00:00 

Если я попытаюсь найти какие-либо записи, соответствующие дате начала с сегодняшним днем, например, я получу ноль

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

Ответы [ 3 ]

48 голосов
/ 10 мая 2011

Имейте в виду, что DateTime содержит дату и время, поэтому вы ищете записи, которые имеют точное значение, а не только один и тот же день.

Вы можете сделать это одним из двух способов. Вы можете выбрать диапазон времени от начала дня до конца или создать столбец date, чтобы лучше сгруппировать данные.

Версия диапазона выглядит так:

@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all

Другой требует создания нового столбца start_date в вашей таблице и заполнения его датами соответственно. Вы можете индексировать эту дату, и ваши запросы будут выполняться намного быстрее, поскольку выбор диапазона не всегда быстр для больших наборов данных.

42 голосов
/ 24 апреля 2016

Rails 5.1 представил Date#all_day помощник, который возвращает объект диапазона для данной даты, поэтому вы можете просто написать:

Deal.where(start: Date.today.all_day)

Вы также можете использовать SQL DATE() функция для вашей цели, например:

@deals = Deal.where('DATE(start) = ?', Date.today)
5 голосов
/ 08 сентября 2017

Для тех, кто еще на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...