Зарегистрируйтесь, чтобы продолжить обучение

Модель Ruby: ActiveRecord (ORM)

Модель как класс

Модель — это воплощение понятия предметной области в коде приложения. В Active Record каждая модель представлена классом в коде и таблицей в базе данных:

class Course < ApplicationRecord

end

Модель = Класс только в классовых языках. Технически она может быть чем угодно, это зависит от языка.

Связь Модель-Таблица — это особенность паттерна Active Record. В другом подходе все может быть по-другому.

Разберем, что необходимо делать, чтобы модель работала.

Для работы модели нужно создать таблицу в базе данных. В веб-фреймворках это делается через миграции, которые создаются автоматически при генерации модели из командной строки:

rails generate model Course

В нашем же случае используется файл db/schema.rb, в котором есть определение таблицы courses:

ActiveRecord::Schema.define(version: 2023_05_04_123456) do

  create_table "courses", force: :cascade do |t|
    t.string "title", null: false
    t.text "description"
    t.decimal "price", default: 0
    t.timestamps
  end

end

Этого описания достаточно для начала работы. Теперь можно создавать сущности, сохранять их в базу и обновлять:

# Создание курса
course = Course.new
course.title = 'Hexlet Ruby on Rails'
course.description = 'Курс для изучения Ruby on Rails'
course.price = 19.99

course.save # INSERT (добавление новой записи)

# Обновление курса
course.price = 12.5
course.save # UPDATE (обновление существующей записи)

# Выводит содержимое объекта
puts course.inspect

# #<Course id: 1,
#   title: "Hexlet Ruby on Rails",
#   description: "Курс для изучения Ruby on Rails",
#   price: "12.5",
#   created_at: "2023-05-04 20:11:02",
#   updated_at: "2023-05-04 20:11:02">

# Удаление курса
course.destroy # Удаляет курс, вызывая метод destroy() на объекте

Этот код работает благодаря подходу «соглашения вместо конфигурации» — Convention Over Configuration. Нам не пришлось явно указывать имя таблицы, с которой связана модель. Active Record автоматически получил ее имя, выполнив приведение имени класса к нижнему регистру и сделав его во множественном числе.

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

Из примера выше видно, что при создании или обновлении сущности, используется метод save(). А Active Record сам распознает, что сейчас происходит: создание или обновление.

Когда сущность сохранилась в базу, ее можно извлечь. Самый простой способ сделать это — воспользоваться статическим методом find($id). Он выполняет поиск по первичному ключу.

# Предположим, что запись с таким идентификатором есть в базе данных
course = Course.find(1)

# Если записи не существует, то вызовется исключение ActiveRecord::RecordNotFound
course.find(100)

# Чтобы не получить исключение, можно использовать метод find_by
# find_by возвращает nil, если записи не существует
Course.find_by(id: 100)

Выводы

Active Record — это удобный способ взаимодействия с базой данных. Он скрывает сложности SQL и позволяет нам работать с данными, как с обычными объектами кода. Соглашения, которые были приняты в Rails, автоматизируют большинство задач, что делает код легким для чтения и понимания.


Самостоятельная работа

  1. Создайте новое Rails-приложение и запушьте его на Github.
  2. Повторите все шаги из теории, создайте модель Курса. Можете использовать схему БД pg-dump-example.

Дополнительные материалы

  1. Основы Active Model

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff