Rails, задающие условия для загруженных ассоциаций - PullRequest
0 голосов
/ 03 июня 2018

У меня есть Пользователи и модели Todos, у пользователей есть много задач, и todo принадлежит пользователю, и мне нужно найти пользователей, которые создали задачу в последний день, если есть, тогда отправьте им электронное письмо.Я пробовал запрос из руководства , но он не возвращает никаких записей, даже несмотря на то, что есть (я думаю) формат даты:

User.includes(:todos).where(todos: { created_at: 1.day.ago})

Я также пробовал:

User.includes(:todos).where(todos: { created_at: 1.day.ago.to_date})

и

User.includes(:todos).where(todos: { "date(created_at) = ?", 1.day.ago.to_date})

, но последний не работает: SyntaxError: unexpected '}', expecting end-of-input

Я использую Postgres, created_at - поле даты и времени (временная метка рельсов по умолчанию)

в Psql:

created_at | timestamp without time zone | not null

1 Ответ

0 голосов
/ 03 июня 2018

В соответствии со спецификациями в посте, вам нужно получить задачи, созданные за прошедший день, поэтому

нижеприведенный запрос не будет работать

User.includes(:todos).where(todos: { created_at: 1.day.ago.to_date})

за 1 день.ago дает определенную временную метку, и база данных ищет ту же самую временную метку, то есть, включая совпадающие часы, минуты и секунды.

Таким образом, лучшим подходом будет поиск временной метки, охватывающей весь день, и, таким образом, предоставление диапазонабудет лучшим вариантом.

Измените запрос, как указано ниже:

User.includes(:todos).references(:todos).where("todos.created_at >= ? and todos.created_at <= ?", 1.day.ago.beginning_of_day, 1.day.ago.end_of_day)

Это позволит получить задачи, созданные за прошедший день, охватывающие весь день.

...