Una migrazione è un file Ruby che descrive una modifica allo schema del database. È versionata, reversibile e condivisa col team: il "git" della struttura dati.

class CreateLaunches < ActiveRecord::Migration[7.1]
  def change
    create_table :launches do |t|
      t.string :name, null: false
      t.string :provider
      t.datetime :net       # No Earlier Than
      t.timestamps
    end
    add_index :launches, :provider
  end
end

Lanci rails db:migrate e la tabella nasce; rails db:rollback la annulla. Il metodo change è abbastanza intelligente da sapere come invertire la maggior parte delle operazioni.

La regola: mai modificare una migrazione già eseguita in produzione. Ne crei una nuova. Lo storico deve restare fedele a ciò che è successo davvero.