Skip to main content

prepend_callbacks

🔄 Overriding Callback Order with prepend: true​

By default, subclasses append callbacks after parent callbacks. Use prepend: true to ensure your callback runs before inherited ones. This is crucial when you need to enforce preconditions before any parent logic executes.

class BaseRecord < ApplicationRecord
before_save :log_save, prepend: true

private

def log_save
Rails.logger.info("BaseRecord saving: #{self.id}")
end
end

class SpecialRecord < BaseRecord
before_save :validate_special, prepend: true

private

def validate_special
throw(:abort) unless special_flag?
end
end

Here, validate_special runs before log_save, even though log_save is declared in the parent. This helps you compose complex callback stacks predictably.