Как сделать запрос с помощью 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
отображать мои продукты, упорядоченные по цене на веб-сайте. Ура, мы сделали это!