Rails ActiveRecord - выбирает все объекты по дате, используя только день, месяц, год, но игнорируя остальные компоненты даты - PullRequest
0 голосов
/ 07 июня 2019

У меня есть модель с именем Event.Я хочу иметь возможность получить все события, которые были созданы на определенную дату, которая должна выглядеть примерно так:

Event.where(created_at: "20/01/2019".to_date)

Проблема в том, что поле created_at также содержит минуты,во-вторых, и т. д., который я хочу игнорировать.Я только хочу сравнить дату по дню, месяцу и году.Есть ли способ, которым я могу этого достичь?

1 Ответ

2 голосов
/ 07 июня 2019

Вы можете использовать Date#beginning_of_day и Date.end_of_day, оба предоставлены ActiveSupport базовыми расширениями.

d = '2019-01-20'.to_date 
Event.where(created_at:(d.beginning_of_day..d.end_of_day))

Это не обязательно будет сравнивать "... дату по дню, месяцу и году". но вместо этого он создаст промежуточное предложение, охватывающее весь день. Если вы хотите использовать синтаксис поиска Hash, это, вероятно, лучший способ сделать это.

Вы могли бы пойти с

Event.where(
  Arel::Nodes::NamedFunction.new('CAST',
     [Event.arel_table[:created_at].as('DATE')]
  ).eq(d)
)

Если вы действительно хотите сравнить только день, месяц и год.

Вариант 1 приведет к

 events.created_at BETWEEN '2019-01-20 00:00:00' AND '2019-01-20 23:59:59'

Вариант 2 приведет к

 CAST(events.created_at AS DATE) = '2019-01-20'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...