В Ruby on Rails наследование одной таблицы (STI) — это метод, который позволяет хранить объекты нескольких типов в одной таблице базы данных, сохраняя при этом их индивидуальные характеристики. При работе с STI Rails предоставляет различные обратные вызовы, которые позволяют выполнять действия в определенных точках жизненного цикла объекта. В этой статье мы рассмотрим различные методы обратного вызова в Rails с STI и предоставим примеры кода для демонстрации их использования.
- before_validation:
Обратный вызовbefore_validationзапускается до проверки объекта. Это позволяет вам изменять атрибуты объекта или выполнять любую необходимую предварительную обработку. Вот пример:
class Vehicle < ApplicationRecord
before_validation :set_default_color
def set_default_color
self.color ||= "black"
end
end
- after_validation:
Обратный вызовafter_validationзапускается после проверки объекта. Его можно использовать для выполнения любых действий после проверки, таких как отправка уведомлений или обновление связанных записей. Вот пример:
class Vehicle < ApplicationRecord
after_validation :notify_owner
def notify_owner
NotificationMailer.vehicle_validated(self).deliver_now
end
end
- before_save:
Обратный вызовbefore_saveзапускается непосредственно перед сохранением объекта в базе данных. Это позволяет вам вносить любые окончательные изменения в атрибуты объекта. Вот пример:
class Vehicle < ApplicationRecord
before_save :capitalize_brand
def capitalize_brand
self.brand = brand.capitalize
end
end
- after_save:
Обратный вызовafter_saveзапускается после сохранения объекта в базе данных. Его можно использовать для выполнения любых действий после сохранения, таких как обновление связанных моделей или создание связанных записей. Вот пример:
class Vehicle < ApplicationRecord
after_save :generate_vehicle_report
def generate_vehicle_report
ReportGenerator.generate(self)
end
end
- before_create:
Обратный вызовbefore_createзапускается перед созданием и сохранением нового объекта в базе данных. Его можно использовать для установки значений по умолчанию или выполнения любой необходимой предварительной обработки. Вот пример:
class Vehicle < ApplicationRecord
before_create :set_registration_number
def set_registration_number
self.registration_number = generate_registration_number
end
end
- after_create:
Обратный вызовafter_createзапускается после того, как новый объект был создан и сохранен в базе данных. Его можно использовать для выполнения любых действий после создания, таких как отправка уведомлений или инициализация связанных записей. Вот пример:
class Vehicle < ApplicationRecord
after_create :send_welcome_message
def send_welcome_message
NotificationMailer.welcome_vehicle(self).deliver_now
end
end
- before_update:
Обратный вызовbefore_updateзапускается перед обновлением и сохранением существующего объекта в базе данных. Это позволяет вам изменять атрибуты объекта или выполнять любую необходимую предварительную обработку. Вот пример:
class Vehicle < ApplicationRecord
before_update :check_if_color_changed
def check_if_color_changed
if color_changed?
NotificationMailer.color_changed(self).deliver_now
end
end
end
- after_update:
Обратный вызовafter_updateзапускается после того, как существующий объект был обновлен и сохранен в базе данных. Его можно использовать для выполнения любых действий после обновления, таких как регистрация изменений или запуск соответствующих обновлений. Вот пример:
class Vehicle < ApplicationRecord
after_update :log_color_change
def log_color_change
ChangeLog.create(
vehicle_id: id,
attribute: "color",
old_value: color_before_last_save,
new_value: color
)
end
end
Обратные вызовы Rails в режиме однотабличного наследования (STI) предоставляют мощный способ подключения к жизненному циклу объектов и выполнения действий в определенных точках. Эффективно используя эти обратные вызовы, вы можете автоматизировать задачи, поддерживать целостность данных и оптимизировать логику вашего приложения. Понимание различных методов обратного вызова, доступных в Rails, позволит вам писать более чистый и удобный в сопровождении код.
Не забывайте использовать их с умом и учитывать конкретные требования вашего приложения, чтобы определить подходящий обратный вызов для каждого сценария.