環境
- Rails 5.2
- Ubuntu20.4
内容
マイグレーションファイルで、test1sテーブルのtest1_codeカラムに、デフォルト値として 「 ""(空白)」 を設定する記述をします。
xxx.rb
def change
change_column_default :test1s, :test1_code, ""
end
マイグレーションを実行すると、正常に実行されました。
$rails db:migrate
schema.rbを見ると、デフォルト値が確かに反映されています。
shema.rb
create_table "test1s", force: :cascade do |t|
t.string "test1_code", default: ""
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
マイグレーションファイルをロールバックします。すると、エラーが発生しました。デフォルト値を削除してくれると思ったのだが、削除してくれませんでした。
$rails db:rollback
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
change_column_default is only reversible if given a :from and :to option.
マイグレーションファイルにデフォルト値を設定する記述をする場合は、changeメソッドを利用するのではなく、次のように記述する必要があります。デフォルト値の設定を削除する場合は、nilをセットすればいいことになります。
xxx.rb
def up
change_column_default :test1s, :test1_code, ""
end
def down
change_column_default :test1s, :test1_code, nil
end
マイグレーションファイルの重複行をなくしたいと思ったら、このように書けばスッキリします。
xxx.rb
def up
hoge("");
end
def down
hoge(nil);
end
def hoge(flg)
change_column_default :test1s, :test1_code, flg
end
再び、マイグレーションファイルをロールバックすると、処理は成功しました。
$rails db:rollback
schema.rbを見ると、デフォルト値が確かに削除されていました。
scheme.rb
create_table "test1s", force: :cascade do |t|
t.string "test1_code"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end