Модель как класс
Модель — это воплощение понятия предметной области в коде приложения. В 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, автоматизируют большинство задач, что делает код легким для чтения и понимания.
Самостоятельная работа
- Создайте новое Rails-приложение и запушьте его на Github.
- Повторите все шаги из теории, создайте модель Курса. Можете использовать схему БД pg-dump-example.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.