Понимание обратных вызовов Rails при наследовании одной таблицы (STI)

В Ruby on Rails наследование одной таблицы (STI) — это метод, который позволяет хранить объекты нескольких типов в одной таблице базы данных, сохраняя при этом их индивидуальные характеристики. При работе с STI Rails предоставляет различные обратные вызовы, которые позволяют выполнять действия в определенных точках жизненного цикла объекта. В этой статье мы рассмотрим различные методы обратного вызова в Rails с STI и предоставим примеры кода для демонстрации их использования.

  1. before_validation:
    Обратный вызов before_validationзапускается до проверки объекта. Это позволяет вам изменять атрибуты объекта или выполнять любую необходимую предварительную обработку. Вот пример:
class Vehicle < ApplicationRecord
  before_validation :set_default_color
  def set_default_color
    self.color ||= "black"
  end
end
  1. after_validation:
    Обратный вызов after_validationзапускается после проверки объекта. Его можно использовать для выполнения любых действий после проверки, таких как отправка уведомлений или обновление связанных записей. Вот пример:
class Vehicle < ApplicationRecord
  after_validation :notify_owner
  def notify_owner
    NotificationMailer.vehicle_validated(self).deliver_now
  end
end
  1. before_save:
    Обратный вызов before_saveзапускается непосредственно перед сохранением объекта в базе данных. Это позволяет вам вносить любые окончательные изменения в атрибуты объекта. Вот пример:
class Vehicle < ApplicationRecord
  before_save :capitalize_brand
  def capitalize_brand
    self.brand = brand.capitalize
  end
end
  1. after_save:
    Обратный вызов after_saveзапускается после сохранения объекта в базе данных. Его можно использовать для выполнения любых действий после сохранения, таких как обновление связанных моделей или создание связанных записей. Вот пример:
class Vehicle < ApplicationRecord
  after_save :generate_vehicle_report
  def generate_vehicle_report
    ReportGenerator.generate(self)
  end
end
  1. before_create:
    Обратный вызов before_createзапускается перед созданием и сохранением нового объекта в базе данных. Его можно использовать для установки значений по умолчанию или выполнения любой необходимой предварительной обработки. Вот пример:
class Vehicle < ApplicationRecord
  before_create :set_registration_number
  def set_registration_number
    self.registration_number = generate_registration_number
  end
end
  1. after_create:
    Обратный вызов after_createзапускается после того, как новый объект был создан и сохранен в базе данных. Его можно использовать для выполнения любых действий после создания, таких как отправка уведомлений или инициализация связанных записей. Вот пример:
class Vehicle < ApplicationRecord
  after_create :send_welcome_message
  def send_welcome_message
    NotificationMailer.welcome_vehicle(self).deliver_now
  end
end
  1. 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
  1. 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, позволит вам писать более чистый и удобный в сопровождении код.

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