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を複数回実行してもそのたびに同じマイグレーションが実行されることはない=冪等性がある