0Pricing
Ruby Academy · Урок

Проверки и запросы

Целостность данных и запросы

«Проверки и запросы» — бесплатный урок Ruby Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.

Зачем нужны проверки

Проверки защищают ваши данные до того, как они попадут в базу данных. Они выполняются при сохранении записи и отклоняют недопустимые данные, сообщая понятные причины.

  • Они не пропускают некорректные данные (отсутствующие имена, неверно сформированные адреса электронной почты).
  • Они выполняются в Ruby, поэтому сообщения легко показывать пользователям.
  • Они дополняют ограничения базы данных, а не заменяют их.

Проверка наличия

Самое распространённое правило — validates :field, presence: true: оно требует непустого значения. Сохранение записи без этого значения завершается неудачей и добавляет ошибку.

class User < ApplicationRecord
  validates :name, presence: true
end

# User.create(name: "") fails to save

Проверка уникальности

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

class User < ApplicationRecord
  validates :email, presence: true, uniqueness: true
end

Формат и длина

Другие встроенные средства проверки:

  • length: { minimum: 8 } для ограничения размера.
  • format: { with: /regex/ } для проверки шаблонов.
  • numericality: true для чисел.
  • inclusion: { in: [...] } для разрешённых значений.
class User < ApplicationRecord
  validates :password, length: { minimum: 8 }
  validates :age, numericality: { greater_than: 0 }
end

valid? и errors

Вызовите valid?, чтобы выполнить проверки без сохранения записи. После неудачного сохранения record.errors содержит сведения о проблемах, а errors.full_messages возвращает понятные строки для пользовательского интерфейса.

user = User.new(name: "")
if user.valid?
  user.save
else
  puts user.errors.full_messages
end

save против save!

Оба варианта сохранения:

  • save возвращает true/false, поэтому результат можно проверить условием.
  • save! при ошибке вызывает исключение RecordInvalid; это удобно, когда недопустимые данные должны приводить к исключению.

Тот же подход действует для create/create! и update/update!.

user.save   # => false if invalid
user.save!  # => raises if invalid

Пользовательские проверки

Для правил, которых нет среди встроенных, напишите метод и зарегистрируйте его с помощью validate. Добавляйте ошибки через errors.add.

class User < ApplicationRecord
  validate :name_not_admin

  def name_not_admin
    if name == "admin"
      errors.add(:name, "cannot be admin")
    end
  end
end

Запросы с where

Интерфейс запросов начинается с where, который фильтрует строки. Он возвращает ленивое отношение, к которому можно добавить другие методы до обращения к базе данных.

User.where(active: true)
User.where("age > ?", 18)
User.where(role: ["admin", "editor"])

Сортировка и ограничение количества

Формируйте результаты с помощью методов, которые можно объединять в цепочку:

  • order(created_at: :desc) сортирует результаты.
  • limit(10) и offset(20) разбивают результаты на страницы.
  • select(:id, :name) выбирает столбцы.
User.where(active: true)
    .order(created_at: :desc)
    .limit(10)

Агрегаты и ленивая загрузка

Агрегатные вспомогательные методы вызывают функции базы данных: count, sum(:amount), average(:age), maximum, minimum. Отношения являются ленивыми: запрос выполняется только при переборе результатов, вызове агрегатного метода или использовании to_a.

User.where(active: true).count
Order.sum(:total)
User.average(:age)

Области запросов

Область запроса даёт имя повторно используемому запросу, чтобы его можно было удобно комбинировать. Области возвращают отношения и объединяются друг с другом, а также с where.

class User < ApplicationRecord
  scope :active, -> { where(active: true) }
  scope :adults, -> { where("age >= ?", 18) }
end

User.active.adults

Быстрая проверка

Проверьте, насколько хорошо вы поняли проверки и запросы.

Повторение: проверки и запросы

Вы научились защищать и получать данные:

  • Проверки наличия, уникальности, длины и формата защищают операции сохранения.
  • valid? и errors сообщают об ошибках, а save! вызывает исключение.
  • Пользовательские проверки позволяют задавать особые правила.
  • where, order, limit, агрегаты и области запросов создают ленивые запросы.

На этом курс «Модели и Active Record» завершён.

Часто задаваемые вопросы

Урок «Проверки и запросы» бесплатный?

Да — полный текст урока «Проверки и запросы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.

Чему я научусь в уроке «Проверки и запросы»?

Целостность данных и запросы Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Ruby Academy?

Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Проверки и запросы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Ruby Academy?

Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы Active Record
  2. Миграции
  3. Связи
  4. Проверки и запросы
← Назад к Ruby Academy