Миграции Active Record позволяют безопасно изменять схему базы данных с течением времени с помощью чистого Ruby DSL без необходимости писать сырые SQL DDL инструкции.
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 # Временные метки: 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