マイグレーション作成時にchangeメソッドではなくup/downメソッドを使う場面(Rails)
【結論】
・マイグレーションを作成する場合、up/down
メソッドを利用する方法と、change
メソッドを利用する方法が存在する
・up/down
メソッドはマイグレーション時とロールバック時の両方の処理内容を定義する必要があるのに対して、change
メソッドはマイグレーション時の処理だけ定義すれば、ロールバック時の処理は自動で判断する
・change
メソッドが認識できないマイグレーション定義は、up/down
メソッドを利用する必要がある
【目次】
【本題】
マイグレーションの作成方法
Railsのマイグレーションの作成方法は、大きく分けて二種類存在します。
それは、up/down
メソッドを利用する方法と、change
メソッドを利用する方法です。
up/down
メソッド
up/down
メソッドは、up
にマイグレーション時の処理を、down
にロールバック時の処理を定義する方法です。
例えば、Post
テーブルのname
カラムを追加したい場合、up/down
メソッドでは以下のように定義します。
class ChangeColumnPost < ActiveRecord::Migration def up add_column :post, :name, :string end def down remove_column :post, :name end end
このように記述することで、マイグレーション時はカラム追加の処理が実行され、ロールバック時にはカラム削除の処理が実行されます。
change
メソッド
change
メソッドは、マイグレーション時の処理だけ定義する方法です。
先程と同様に、Post
テーブルのname
カラムを追加したい場合、change
メソッドでは以下のように定義します。
class ChangeColumnPost < ActiveRecord::Migration def change add_column :post, :name, :string end end
ロールバック時の処理が定義されていませんが、ロールバックを実行する際は、マイグレーション定義から自動的に判断して実行してくれます。
up/down
メソッドを利用するケース
この様に、change
メソッドの方がup/down
メソッドより簡潔に処理内容が記述できるので、change
メソッドを使用した方が良いでしょう。
では、up/down
メソッドはいつ使用するのかと言うと、change
メソッドがロールバックの処理を認識できないマイグレーション定義を利用する場合に用います。
現状、changeメソッドがサポートされているマイグレーション定義は以下の通りです。
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
なお、change_table
を利用する場合は、ブロックでchange・change_default・remove
が呼び出されていると、changeメソッドでロールバックの処理が識別できません。