0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

change_column_defaultのrollbackを流すには

Last updated at Posted at 2022-07-14

環境

  • 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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?