Ruby On Rails
Теория: Модели
В этом уроке мы познакомимся с моделями в Ruby on Rails. Мы рассмотрим, как модели управляют данными и бизнес-логикой приложения, обеспечивая взаимодействие с базой данных и валидацию данных. Узнаем, как генерировать модели, создавать миграции для управления схемой базы данных и использовать Active Record для выполнения запросов.
Подготовка
Для работы Rails с базой данных, необходимо ее подготовить. По умолчанию Rails использует SQLite для работы с БД. Настройки подключения к базе данных хранятся в файле config/database.yml
Что такое модель
Модель — это один из трех основных компонентов архитектуры MVC (Model-View-Controller), используемой в Ruby on Rails и других фреймворках. Model отвечает за управление данными, бизнес-логикой и правилами приложения. Модель взаимодействует с базой данных, выполняет операции CRUD (создание, чтение, обновление, удаление) и обеспечивает валидацию данных. Она определяет структуру данных и их взаимосвязи, а также содержит методы для работы с этими данными.
Модели представляют собой абстракцию данных, хранящихся в базе данных. Они определяют, какие данные будут храниться, как они будут структурированы и как будут связаны между собой.
Связь класса модели с таблицей
Модели в Ruby On Rails используют Active Record — встроенный ORM (Object-Relational Mapping) в Rails, который упрощает взаимодействие с базой данных. Active Record позволяет разработчикам выполнять запросы к базе данных, не написав ни одной строки SQL, что делает код более читаемым и поддерживаемым.
Миграции
Если у нас еще нет структуры базы данных, ее необходимо подготовить. Для этого используют миграции. Миграции в Ruby on Rails представляют собой механизм для управления схемой базы данных. Они позволяют разработчикам изменять структуру базы данных с помощью кода, что делает процесс управления схемой более удобным и безопасным. Миграции обеспечивают версионирование изменений в базе данных, позволяя легко откатывать или применять изменения по мере необходимости. Это особенно полезно в командной разработке, где несколько разработчиков могут вносить изменения в базу данных одновременно.
Создадим таблицу пользователей с помощью миграции
Эта команда создаст миграцию /tmp/static_pages_app/db/migrate/xxxxxxxxxxxxxx_create_users.rb. Где xxxxxxxxxxxxxx - это дата создания миграции:
Применим миграцию
Проверим, что все было выполнено успешно:
schema.rb
После первой миграции будет создан файл db/schema.rb. Он отображает текущую структуру базы данных, включая таблицы, столбцы и индексы. Файл обновляется при создании и применении миграций, позволяет восстанавливать структуру базы данных, синхронизировать ее в командной разработке и служит документацией для разработчиков.
Модели
Также, как и контроллеры, модели можно создать с помощью генератора. Он принимает имя модели, атрибуты и их тип
Команда создаст модель и миграции, если их нет:
Если же они есть, и модель совпадает со схемой таблицы, то команда миграции не затронет
Валидация модели
Валидация в Ruby on Rails — это процесс проверки данных перед их сохранением в базе данных. Она обеспечивает целостность и корректность данных, предотвращая сохранение некорректной или неполной информации. Валидации помогают гарантировать, что данные соответствуют определенным критериям, таким как обязательные поля, уникальность значений и формат данных. Это особенно важно для поддержания качества данных и предотвращения ошибок, которые могут возникнуть при работе с некорректной информацией.
Rails предоставляет встроенные валидации, которые можно использовать в моделях. Пример модели с различными валидациями:
Мы можем добавить в нашу модель валидацию и проверить ее работу:
Метод validate() выполняет валидацию и если все проверки прошли, то он вернет true.
У метода validate() есть аналогичный bang-метод validate!(). В отличии от validate() он выбрасывает исключение ActiveRecord::RecordInvalid. Это позволяет вам обрабатывать ошибки валидации более явно.
в ActiveRecord у моделей есть еще метод valid?(), который тоже выполняет валидацию. Но так как функция - предикат, следует использовать метод по назначению - для проверки валидности модели и явно проверять, валидна модель или нет
Получение ошибок валидации
После выполнения валидации мы можем получить сообщения об ошибках. Для их получение необходимо использовать метод errors() у модели.
Если валидация прошла без ошибок, то и ошибок не будет:
Методы messages() и full_messages() позволяют получить тексты ошибок:
Перед вызовом метода validate или validate!, вы можете получить доступ к объекту errors, но он будет пустым, так как валидация еще не была выполнена:
Методы модели для работы с БД
Методы моделей Active Record позволяют выполнять операции CRUD (Create, Read, Update, Delete) и управлять данными в БД
Создание записей
Модели Rails предоставляют методы создания объектов в БД:
Метод save() сохраняет модель и возвращает булево значение:
Метод create() позволяет создать и сохранить модель сразу:
Валидация работает и на методах создания, перед сохранением в БД. Метод save() выполняет валидацию перед сохранением, и если объект не проходит валидацию, он не будет сохранен, а метод вернет false. Если валидация проходит успешно, объект будет сохранен, и метод вернет true.
Метод create() при неуспешной валидации не сохранит модель
У методов создания есть аналогичные save!(), create!(), которые выбрасывают исключение
Методы чтения
Различные методы чтения у моделей позволяют находить объекты, сортировать их
-
all()возвращает все записи из таблицы -
find()находит запись по ее ID. Если запись не найдена, выбрасывает исключение
find_by()находит первую запись, соответствующую заданным условиям. Возвращает nil, если запись не найдена.
Методы обновления
Методы обновления позволяют изменять существующие записи в базе данных. Метод update() обновляет атрибуты объекта и сохраняет изменения в базе данных. Если валидация не проходит, изменения не сохраняются.
- Метод
update!работает аналогичноupdate, но выбрасывает исключениеActiveRecord::RecordInvalid, если валидация не проходит.
- Метод
update_all()обновляет все записи, соответствующие заданному условию, и не вызывает валидацию. Он используется для массового обновления.
Методы удаления
Для удаления используют метод Model.destroy(), он удаляет экземпляр объекта из БД. Метод Model.destroy_all() удаляет все записи
Query Builder
Query Builder — это часть Active Record, которая позволяет строить SQL-запросы с помощью методов. Методы можно комбинировать с помощью fluent interface, создавая выборки.
Выбор всех пользователей по имени John
Поиск без условия с лимитом
Можно использовать и агрегатные функции SQL
Более сложный запрос
Сиды
Сиды (или seed data) в Ruby on Rails представляют собой начальные данные, которые загружаются в базу данных при первом запуске приложения или при необходимости заполнить базу данными для тестирования.
Как использовать сиды в Rails
В Rails файл сидов находится по умолчанию в файле db/seeds.rb. Этот файл используется для определения начальных данных, которые будут загружены в базу данных.
Внутри файла db/seeds.rb мы можем использовать методы ActiveRecord для создания записей. Чтобы не создавать тестовые данные вручную, можно использовать специальный гем faker:
После того как мы определили начальные данные в файле db/seeds.rb, их можно загрузить их в базу данных с помощью команды:
Если нужно обновить сиды, то можно просто изменить файл seeds.rb и снова запустить команду rails db:seed. Однако, если мы хотим избежать дублирования данных, то нужно очистить таблицы, используя метод destroy_all:
Скоупы
Скоупы (scopes) в Ruby on Rails — это удобный способ определения часто используемых запросов к базе данных в моделях. Они позволяют создавать методы, которые возвращают наборы записей, соответствующие определенным условиям, и делают код более читаемым и поддерживаемым.
Синтаксис:
Определим скоуп активных пользователей:
Применение:
Скоупы можно комбинировать для создания более сложных запросов
Rails Console
Rails Console — это REPL позволяющий работать с приложением Ruby on Rails.
Ее можно вызвать командой bin/rails c:
Внутри консоли можно обратиться к методам моделей, создать их, прочитать и так далее. При выполнении запросов к БД выводятся SQL запросы
Консоль можно использовать для отладки:
Или загрузить данные из сидов:
Если мы что-то изменим в коде, то изменения не подтянутся автоматом. Для этого нужно использовать метод reload!
Для выхода из консоли необходимо ввести exit.
Выводы
Модели в Ruby on Rails играют ключевую роль в управлении данными и бизнес-логикой, соответствуя таблицам в базе данных и определяя структуру данных.
Миграции предоставляют разработчикам возможность изменять структуру базы данных с помощью кода, что упрощает процесс управления схемой и обеспечивает версионирование изменений.
Валидация данных перед их сохранением гарантирует целостность и корректность информации, предотвращая ошибки. Методы работы с данными, такие как создание, чтение, обновление и удаление записей, делают взаимодействие с базой данных более удобным.
Сиды позволяют загружать начальные данные в базу для тестирования и разработки, а скоупы упрощают создание часто используемых запросов, делая код более читаемым и поддерживаемым

