3.11 up/downメソッドを使う
changeの代わりに、従来のupメソッドとdownメソッドも利用できます。 upメソッドにはスキーマに対する変換方法を記述
し、downメソッドにはupメソッドによって行われた変換をロールバック(逆転)する方法を記述
する必要があります。つまり、upの後にdownを実行した場合、スキーマが元に戻る必要があります。 たとえば、upメソッドでテーブルを作成したら、downメソッドではそのテーブルを削除する必要があります。downメソッド内で行なう変換の順序は、upメソッド内で行なう順序の正確な逆順にするのがよい
でしょう。先のreversibleセクションの例は以下と同等になります。
class ExampleMigration < ActiveRecord::Migration [7.0]
def up
create_table :distributors do |t|
t.string :zipcode
end
# CHECK制約を追加
execute <<-SQL
ALTER TABLE distributors
ADD CONSTRAINT zipchk
CHECK (char_length(zipcode) = 5);
SQL
add_column :users, :home_page_url, :string
rename_column :users, :email, :email_address
end
def down
rename_column :users, :email_address, :email
remove_column :users, :home_page_url
execute <<-SQL
ALTER TABLE distributors
DROP CONSTRAINT zipchk
SQL
drop_table :distributors
end
end
マイグレーションが逆進不可能な場合、downメソッド内でActiveRecord::IrreversibleMigrationエラーを発生させる必要があります。こうすることで、誰かが後にマイグレーションを逆進させたときに、実行不可能であることを示すエラーが表示
されます。
出典
関連記事
感想
upメソッド、downメソッドを書くことでrails db:rollback
でエラーが起きなくなった。
少し扱いやすくなった。
辻褄を合わせることが大事なのか。