Иногда Active Record достигает предела. Множество ресурсов (таких как эта статья или этот доклад) посоветуют вам использовать Арел, но что меня больше всего поразило, когда я попытался использовать арел, так это то, что я мог не нашел подробного руководства по использованию запросов, которые я мог бы построить с помощью Arel. Все они просто предоставили запрос Arel и распечатали to_sql, чтобы доказать, что это правильный запрос. Эта небольшая статья посвящена двум различным способам выполнения запроса Arel. Предполагается, что вы уже читали об Arel и о том, как составлять сложные запросы, но застряли на том, как их выполнять.

Под Active Record

Active Record внутренне полагается на Arel, и наиболее распространенный способ использования Arel - это использовать его с Active Record. Для простых запросов, которые можно напрямую преобразовать в список моделей (например, обычно возвращает Active Record), вы получите результаты напрямую как обычный запрос активной записи.

Например, если у нас есть модель Cat, мы можем:

cat_arel = Cat.arel_table
soft_fur = Cat.where(cat_arel[fur_quality].gt(5))

Это в основном используется, когда ваш оператор Arel переводится в условие where

Непосредственно как SQL-запрос

Иногда вы хотите оптимизировать свои запросы таким образом, чтобы они не возвращали модель ApplicationRecord. В этом случае вам необходимо выполнить необработанный sql. Для этого просто переведите свой запрос в sql с помощью метода to_sql и выполните его.

ActiveRecord::Base.connection.exec_query(my_query.to_sql)

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

Давай попробуем со случаем, с которым я столкнулся. Я хочу получить как минимальное, так и максимальное значение столбца, и я хочу отправить только один запрос.

cat_arel = Cat.arel_table
query = cat_arel.project(cat_arel[:price].minimum.as(‘min’), cat_arel[:price].maximum.as(‘max’)).to_sql
records = ActiveRecord::Base.connection.exec_query query
puts records.first
>>> {“min”=>0.0, “max”=>72.0}

Обратите внимание, что если бы я не использовал псевдонимы min и max, ключи записи были бы {“MIN(`cats`.`price`)”=>0.0, “MAX(`cats`.`price`)”=>72.0}, что не очень приятно обрабатывать. Если ожидается, что ваш запрос вернет несколько строк, просто переберите результат exec_query.

Подведение итогов

Вот и все. Arel позволяет делать сложные запросы, которые ActiveRecord не может выполнять. Если в результате ActiveRecord может обработать и проанализировать результат, вам повезло, и вы можете просто вставить свои биты в классический запрос ActiveRecord. Или, если вы делаете что-то более сложное, которое не возвращает модель, просто выполните sql, подготовленный arel, и сделайте все, что вам нужно, с результатом.

Мы набираем сотрудников, обращайтесь, если вам нравится, как мы работаем

Https://jobs.captaincontrat.com/