52399


rails の migration で、今ある nullable なカラムを not null にするときには、このように変更するかと思います。

[code]

    def change
      change_column :table_name, :column_name, :column_type, null: false
    end
    
[/code]

このような変更は、 reversible ではないようで、 db:rollback を実行すると、 IrreversibleMigration
が発生してエラーになります。

これを、 reversible な migration を行うような方法はないでしょうか。


CC BY-SA 4.0
2018-10-10T07:02:31.677
49127
2019-01-29T10:32:43.133
754
question
ruby-on-rails
rails の migration で reversible な change_column はありますか？


`up` と `down` を定義するのが良いと思います。

[code]

    def up
      change_column :table_name, :column_name, :column_type, null: false
    end
    
    def down
      change_column :table_name, :column_name, :column_type, null: true
    end
    
[/code]

(参考)

  * [Using the up/down Methods](https://edgeguides.rubyonrails.org/active_record_migrations.html#using-the-up-down-methods)
  * [up/downメソッドを使用する](https://railsguides.jp/active_record_migrations.html#up-down%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)


CC BY-SA 4.0
2018-10-10T07:31:20.303
49130
2018-10-10T07:38:54.370
2018-10-10T07:38:54.370
76
76
49127
answer


reversible な change_column は、少なくとも default や null 制約については存在するようです。

それぞれ、以下のメソッドたちで実現され、

  * change_column_null
  * change_column_default (の、 `from` と `to` オプション)

掲題の例で言えば、

[code]

    def change
      change_column_null :table_name, :column_name, false, value_for_already_null_record_column
    end
    
[/code]

参考:

<https://stackoverflow.com/a/25211732/3090068>


CC BY-SA 4.0
2019-01-29T10:32:43.133
52399
2019-01-29T10:32:43.133
754
49127
answer