Ruby: ActiveRecord (ORM)
Теория: Интерфейс запросов CRUD Active Record
CRUD — это акроним, включающий в себя четыре операции, которые можно осуществлять с данными:
- Create — создание
- Read — чтение
- Update — обновление
- Delete — удаление
Данные операции являются фундаментом для любой системы управления базами данных.
Операции CRUD легко реализуются и интегрируются в приложение с помощью Ruby on Rails и его встроенного интерфейса Active Record. Active Record предоставляет высокоуровневый интерфейс для взаимодействия с данными. Это позволяет разработчикам сосредоточиться на бизнес-логике и не беспокоиться о деталях управления базой данных.
В этом уроке мы разберем, как в Ruby on Rails реализуются операции CRUD с использованием Active Record.
Создание
Рассмотрим, как создать новую запись в базе данных с помощью Active Record.
Модель Student имеет атрибуты first_name и last_name. Далее создадим нового студента:
Другой способ создать запись — использовать метод create:
Метод create объединяет шаги new и save, создает новый объект и сохраняет его в базе данных.
Active Record также предлагает метод create!. Он отличается от create тем, что вызывает исключение ActiveRecord::RecordInvalid при невозможности сохранить объект.
Далее представлен пример использования:
В этом примере мы пробуем создать и сохранить нового студента с помощью create!. Если из-за ошибок валидации студент не может быть сохранен, мы перехватываем исключение ActiveRecord::RecordInvalid и выводим ошибки.
Использование create! вместо create помогает лучше управлять ошибками и предоставляет четкое понимание того, что происходит в случае неудачного сохранения записи.
Чтение
Теперь, когда у нас есть записи в базе данных, мы можем извлекать их с помощью различных методов чтения Active Record.
Для получения всех записей из таблицы мы используем метод all:
Чтобы найти конкретную запись по ее id, мы используем метод find:
Если нам нужно выбрать только определенные записи, мы можем использовать where. Например:
Если нам нужно найти определенную запись по атрибутам, то нам поможет метод find_by. Например:
В этом примере find_by возвращает первый объект Student, который соответствует условиям, или nil, если такого объекта не найдено.
find_by всегда возвращает только одну запись, даже если в базе данных есть несколько записей по данному запросу.
Метод find_by отличается от find не только поиском по любым полям объекта. Если записи не существует, find выбросит исключение, а find_by вернет nil.
Обновление
Сначала нам нужно найти объект, изменить его атрибуты, а затем сохранить эти изменения для обновления записи в базе:
В примере выше мы находим студента с id 1. Далее изменяем его имя на Hexleta и сохраняем эти изменения.
Если нам нужно обновить несколько записей одновременно, мы можем использовать update_all. Например, чтобы изменить имя всех студентов с именем Hexlet на Hexleta:
Но есть одно замечание. Метод update_all напрямую отправляет запрос в базу данных в обход валидаций модели. Поэтому его нужно использовать крайне осторожно.
Удаление
Мы можем использовать методы destroy, destroy_all, delete и delete_all для удаления записей из базы данных.
Метод destroy удаляет запись и вызывает все действия, которые связанны с удалением. Например, удаление связанных объектов:
Допустим, у нас есть модель Course, которая имеет множество Student:
Теперь, когда мы удаляем Course, связанные объекты Student также будут уничтожены:
Аналогичным образом работает метод destroy_all, только для всех записей, которые мы выбрали:
Метод delete в отличие от destroy удаляет запись напрямую из базы данных. Это может быть полезно, когда нам нужно быстро удалить запись без дополнительной обработки. В этом случае нужно быть осторожным, так как это может привести к нарушению целостности данных.
В следующем примере связанные записи Student с объектом course останутся в таблице даже после его удаления:
delete_all удаляет все записи аналогично методу delete, которые мы нашли:
Выводы
Active Record в Ruby on Rails упрощает работу с базой данных и трансформирует таблицы базы данных в объекты Ruby. С помощью Active Record мы можем легко создавать, читать, обновлять и удалять записи в нашей базе данных.

