Как получить время при запросах в MySQL? - PullRequest
0 голосов
/ 17 апреля 2019

Как мне написать этот запрос рельсов в правильном запросе SQL?

time = (Time.now - 1.days).beginning_of_day
Assignment.where("created_at >= :time OR updated_at >= :time", time: time).pluck(:assignable_id).uniq

Можете ли вы помочь мне преобразовать это в запрос SQL?

select distinct assignable_id from assignments where created_at >= getDate() && updated_at >= getDate();

Мне нужна помощь в том, какполучить дату при запросе?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Невозможно напрямую использовать сравнение неравенств, используя только ActiveRecord, вам придется использовать Arel, который представляет собой API более низкого уровня, на котором построен ActiveRecord. К счастью, вы можете смешивать и сочетать их большую часть времени.

time = (Time.now - 1.days).beginning_of_day
assignments = Assignment.arel_table
Assignment.where(
  assignments[:created_at].gteq(time).or(assignments[:updated_at].gteq(time))
).distinct.pluck(:assignable_id)

Передача текущей даты из кода ruby ​​в большинстве случаев является хорошим решением. Однако, если вы действительно хотите использовать функции базы данных, Арель снова здесь, чтобы помочь.

time = Arel::Nodes::NamedFunction.new('getDate', [])
# or
time = Arel::Nodes::NamedFunction.new('CURDATE', [])
# or any other function you can think of

Arel кажется более сложным, чем просто написание сырого sql на первый взгляд, но ключ - это возможность многократного использования и безопасность. Фрагменты Ареля легко использовать повторно, просто превращая их в методы. Также легко делать ошибки инъекций, используя raw sql, Arel помешает вам делать это в большинстве случаев.

0 голосов
/ 17 апреля 2019

Вы можете получить дату, используя MySQL, используя CURDATE().

Ваш запрос будет выглядеть так:

select distinct assignable_id from assignments where created_at >= CURDATE() AND updated_at >= CURDATE();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...