Riferimento rapido

Guida rapida alle migrazioni del database in Rails

Guida di riferimento rapido per le migrazioni del database in Rails: create_table, tipi di colonna, foreign key, indici compositi e modifiche reversibili.

· Pubblicato

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

Riferimenti

Argomenti correlati