Le migrazioni di Active Record ti consentono di evolvere lo schema del database nel tempo utilizzando un DSL Ruby puro senza dover scrivere istruzioni SQL DDL manuali.
Generatori CLI per le migrazioni
# Genera la migrazione per una nuova tabella
bin/rails g migration CreateArticles title:string body:text published:boolean
# Genera la migrazione per aggiungere una colonna
bin/rails g migration AddViewsToArticles views:integer
# Genera una tabella di join
bin/rails g migration CreateJoinTableUsersProjects users projects
# Esegue le migrazioni in sospeso
bin/rails db:migrate
# Annulla l'ultimo passaggio di migrazione
bin/rails db:rollback STEP=1
Creazione di tabelle (create_table)
class CreateUsers < ActiveRecord::Migration[7.1]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, index: { unique: true }
t.text :bio
t.integer :login_count, default: 0
t.decimal :balance, precision: 10, scale: 2
t.boolean :active, default: true, null: false
t.jsonb :preferences, default: {}
# Riferimento chiave esterna
t.references :organization, null: false, foreign_key: true
t.timestamps # Timestamp: created_at e updated_at
end
end
end
Modifica di colonne e tabelle
class AlterArticles < ActiveRecord::Migration[7.1]
def change
add_column :articles, :status, :string, default: "draft"
remove_column :articles, :legacy_field, :string
change_column_null :articles, :title, false
change_column_default :articles, :views, from: nil, to: 0
rename_column :articles, :author, :writer
add_index :articles, [:status, :created_at]
end
end
Migrazioni reversibili
def change
reversible do |dir|
dir.up do
execute "CREATE EXTENSION IF NOT EXISTS citext;"
end
dir.down do
execute "DROP EXTENSION IF EXISTS citext;"
end
end
end