Мне пришлось выполнить извлечение DOW для экземпляра Arel :: Nodes :: NamedFunction, который не предоставляет метод #extract (по состоянию на Arel 6.0). Мне удалось добиться этого, вручную создав экземпляр Arel::Nodes::Extract
. Вот что сработало для меня, на случай, если у кого-то возникнет похожая проблема:
Arel::Nodes::Extract.new(
Arel::Nodes::NamedFunction.new('some_function_name', [param1, param2, ...]),
:dow
)
Вы можете использовать узел Arel непосредственно с #where
ActiveRecord вместо построения полного запроса через Arel, как показано в ответе Александра Кармеса. Итак, вот еще один способ выполнить запрос, требуемый ответом:
User.where(
Arel::Nodes::Extract.new(User.arel_table[:created_at], :hour).eq(1)
)
Что дает:
SELECT "users".* FROM "users" WHERE EXTRACT(HOUR FROM "users"."created_at") = 1
С дополнительным преимуществом вы можете продолжать цепочку других областей, определенных в вашей модели User
.