Как сделать запрос с помощью Rails Active Record

У меня есть база моих любимых продуктов, в данном случае это материалы для рисования, чтобы делать картины а-ля Боб Росс. С помощью этой базы данных я создавал приложение rails для отображения своих продуктов на витрине магазина (посмотрите на моем github!). Когда я работал над приложением, я хотел отображать свои продукты в удобном для пользователя виде, например, по цене, отсортированной от самой низкой к самой высокой. Однако я не был полностью уверен, как написать код для правильного отображения данных.

Обычно, когда я хочу поиграть со своими данными в своем приложении rails, я открываю консоль rails. Для этого перейдите в свой терминал (на Mac), перейдите к своему приложению и введите rails console (или rails c в качестве ярлыка). Это открывает интерактивную консоль, где вы можете делать запросы с вашими данными! Например, если вы хотите найти первую часть данных в своей базе данных (то есть данные с id = 1), вы можете ввести:

product = Product.first

or

product = Product.find_by(id: 1)

Фактически, мы можем использовать .find_by() и для других атрибутов (например, для продукта name).

Итак, когда я пытался отобразить товары в магазине по цене, я зашел в консоль rails, чтобы попытаться запросить свои данные. Интересно, что когда я набираю product = Product.first, вывод также включает дополнительный текст, выделенный синим цветом:

Этот текст называется SQL, и на самом деле он запрашивает наши данные за кулисами. Присмотревшись к этому SQL, мы видим слова ORDER BY — я подумал, что может быть какой-то SQL, который я мог бы использовать для упорядочения данных по цене. Но что означают эти слова с большой буквы? Ну, как оказалось, они на самом деле делают то, что говорят! SELECT выбирает определенные столбцы данных FROM вашей таблицы данных и ORDER BY упорядочивает данные по выбранному вами атрибуту. Существует множество других терминов SQL, таких как WHERE и COUNT, которые полезны при запросе ваших данных (для получения дополнительной информации существует множество ресурсов SQL, таких как https://sqlzoo.net/).

Итак, теперь я знал, что могу использовать SQL для ORDER BY «цены» — но где мне написать этот код? Вернемся к консоли rails! Мы можем протестировать такие запросы в rails, используя Active Record. В консоли мы можем «конвертировать» наши запросы SQL в запросы активных записей. Например, давайте посмотрим на вывод этого кода:

product = Product.where(“price > ?”, 5)

Как мы видим здесь, мы взяли SQL-запрос SELECT “products” FROM “products” WHERE (price>5) и преобразовали его в активную запись в консоли. Синтаксис очень похож, но не совсем такой же.

Хорошо, похоже, мы идем в правильном направлении, но как насчет сортировки? В SQL мы используем ORDER BY, но в активной записи используем order(). Вот пример того, как это выглядит:

product = Product.order(:name)

и выведенный SQL в консоли выглядит так:

SELECT  "products".* FROM "products" ORDER BY "products"."name" ASC LIMIT $1

Зная это, я попытался отсортировать товары по цене:

product = Product.order(:price)

Это сработало! В моей консоли я увидел свои продукты, расположенные по цене, от самой низкой до самой высокой! (Обратите внимание, мы могли бы добавить :desc после цены, чтобы изменить отображение цены с самой высокой на самую низкую). Теперь пришло время добавить этот код в мое приложение. Мы можем добавить этот код в наш контроллер (например, в контроллер моих продуктов).

def index
    @products = Product.all
    @products = @products.order(:price)
    render 'index.json.jbuilder'
end

Добавление этого кода позволяет действию my productsindex отображать мои продукты, упорядоченные по цене на веб-сайте. Ура, мы сделали это!