Ruby On Rails
2026-02-26 17:13 Diff

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

Миграции предоставляют разработчикам возможность изменять структуру базы данных с помощью кода, что упрощает процесс управления схемой и обеспечивает версионирование изменений.

Валидация данных перед их сохранением гарантирует целостность и корректность информации, предотвращая ошибки. Методы работы с данными, такие как создание, чтение, обновление и удаление записей, делают взаимодействие с базой данных более удобным.

Сиды позволяют загружать начальные данные в базу для тестирования и разработки, а скоупы упрощают создание часто используемых запросов, делая код более читаемым и поддерживаемым