Οι μεταναστεύσεις Active Record σάς επιτρέπουν να εξελίσσετε το σχήμα της βάσης δεδομένων με την πάροδο του χρόνου χρησιμοποιώντας ένα DSL της Ruby χωρίς να γράφετε DDL εντολές SQL.
Εργαλεία παραγωγής μεταναστεύσεων (CLI)
# Δημιουργία μετανάστευσης για νέο πίνακα
bin/rails g migration CreateArticles title:string body:text published:boolean
# Δημιουργία μετανάστευσης προσθήκης στήλης
bin/rails g migration AddViewsToArticles views:integer
# Δημιουργία πίνακα σύνδεσης (join table)
bin/rails g migration CreateJoinTableUsersProjects users projects
# Εκτέλεση εκκρεμών μεταναστεύσεων
bin/rails db:migrate
# Επαναφορά του τελευταίου βήματος μετανάστευσης
bin/rails db:rollback STEP=1
Δημιουργία πινάκων (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: {}
# Αναφορά ξένου κλειδιού
t.references :organization, null: false, foreign_key: true
t.timestamps # timestamps: created_at & updated_at
end
end
end
Τροποποίηση στηλών και πινάκων
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
Αναστρέψιμες μεταναστεύσεις (Reversible)
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