Callback Hooks

Complete reference for lifecycle callbacks in CQL Active Record models.

Overview

Callbacks allow you to trigger logic at specific points in a record's lifecycle:

┌──────────────┐
│  before_save │ ─── Runs before INSERT or UPDATE
├──────────────┤
│    save      │ ─── Database operation
├──────────────┤
│  after_save  │ ─── Runs after INSERT or UPDATE
└──────────────┘

Available Callbacks

before_save

Runs before any save operation (create or update).

struct User
  include CQL::ActiveRecord::Model(Int64)

  before_save :normalize_email

  private def normalize_email
    @email = @email.downcase.strip
    true  # Must return true to continue
  end
end

Use cases:

  • Data normalization

  • Setting computed fields

  • Validation that requires database access

after_save

Runs after any successful save operation.

Use cases:

  • Triggering side effects

  • Updating related records

  • Sending notifications

  • Cache invalidation

before_create

Runs only before INSERT operations (new records).

Use cases:

  • Setting default values

  • Generating tokens or UUIDs

  • Recording creation metadata

after_create

Runs only after successful INSERT operations.

Use cases:

  • Sending welcome emails

  • Creating related records

  • Notifying other systems

before_update

Runs only before UPDATE operations (existing records).

Use cases:

  • Tracking changes

  • Validating state transitions

  • Incrementing version numbers

after_update

Runs only after successful UPDATE operations.

Use cases:

  • Change notifications

  • Audit logging

  • Syncing with external systems

before_destroy

Runs before DELETE operations.

Use cases:

  • Validation before deletion

  • Checking dependencies

  • Preventing deletion of protected records

after_destroy

Runs after successful DELETE operations.

Use cases:

  • Cleaning up files

  • Removing from search indexes

  • Cascade deletes not handled by database

Return Values

Important: Callbacks must return true to continue the operation.

Callback Order

When saving a new record:

  1. before_save

  2. before_create

  3. (database INSERT)

  4. after_create

  5. after_save

When updating an existing record:

  1. before_save

  2. before_update

  3. (database UPDATE)

  4. after_update

  5. after_save

When deleting:

  1. before_destroy

  2. (database DELETE)

  3. after_destroy

Complete Example

See Also

Last updated

Was this helpful?