ActiveRecordマイグレーション

マイグレーションの概要

一つ一つのマイグレーションはデータベースの新しいバージョンとみなすことができる。スキーマは最初空の状態から始まり、マイグレーションによる変更が加わるたびにテーブル、カラム、エントリが追加される。マイグレーションの実行順序はファイル名のタイムスタンプで決まる。

マイグレーションの作成

マイグレーション名が"AddColumnToTable"や"RemoveColumnFromTable"で、かつその後ろにカラム名や型が続く形式になっていれば、適切なadd_column文やremove_column文を含むマイグレーションが作成される。

$ rails generate migration AddPartNumberToProducts part_number:string
class AddPartNumberToProducts < ActiveRecord::Migration[5.0]
  def change
    add_column :products, :part_number, :string
  end
end
changeメソッド

このメソッドを使えば、Active Recordがマイグレーションを逆方向に実行 (ロールバック) する方法を自動的に理解してくれるため、多くの場面で利用できる。以下のマイグレーション定義を使用できる。

add_column
add_foreign_key
add_index
add_reference
add_timestamps
change_column_default (:fromと:toの指定は省略できない)
change_column_null
create_join_table
create_table
disable_extension
drop_join_table
drop_table (ブロックを渡さなければならない)
enable_extension
remove_column(型を指定しなければならない)
remove_foreign_key(2番目のテーブルを指定しなければならない)
remove_index
remove_reference
remove_timestamps
rename_column
rename_index
rename_table
up/downメソッド

upメソッドにはスキーマに対する変換方法を記述し、downメソッドにはupメソッドによって行われた変換を逆転する方法を記述する

class ChangeProductsPrice < ActiveRecord::Migration[5.0]
  def up
    change_table :products do |t|
      t.change :price, :string
    end
  end

  def down
    change_table :products do |t|
      t.change :price, :integer
    end
  end
end

マイグレーションの実行

これまでに実行されていないchangeメソッドまたはupメソッドを実行する

$ rails db:migrate

指定されたマイグレーションに達するまでマイグレーション (change/up/down) を実行する

$ rails db:migrate VERSION=20080906120000

ロールバック

$ rails db:rollback
$ rails db:rollback STEP=3  最後に行った3つのマイグレーションがロールバックされる

マイグレーションの管理

rails db:migrateで未実行のマイグレーションが検知され実行されると、そのマイグレーションIDが記録される。そのため、rails db:migrateを複数回実行してもそのたびに同じマイグレーションが実行されることはない=冪等性がある