Edited at

Railsのmigrationで後からNULL制約を設定する

NULL制約の追加には change_column_null を使います。

引数にはテーブル名、カラム名、null falseかtrueか、変更後のデフォルト値

class ChangePointColumnOnPost < ActiveRecord::Migration[5.2]

def change
change_column_null :posts, :point, false, 0
end
end

https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_column


これだとちょっと問題が…

ここで設定されるdefaultは現在nullのカラムを変更するためだけのもので、テーブルの制約にdefault値が設定されるわけではないので、nullでレコードの追加をしようとした際にコケてしまいます。

そのため別でデフォルト値の設定が必要になります。

NULL制約追加+デフォルト0を設定するコード

postsテーブルのpointカラムがNULL制約なし、デフォルトNULLになっているのを、NULL禁止、デフォルト0に変更するマイグレーションになります。

class ChangePointColumnOnPost < ActiveRecord::Migration[5.2]

def up
change_column_null :posts, :point, false, 0
change_column :posts, :point, :integer, default: 0
end

def down
change_column_null :posts, :point, true, nil
change_column :posts, :point, :integer, default: nil
end
end

※自ブログからの転載です

http://akinov.hatenablog.com/entry/2019/06/20/164836