結論
NN制約のないカラムにNN制約をかけるときはmigrationのdown
メソッドにnull: true
と書く必要はないが、NN制約を外す場合はmigrationのup
メソッドにnull: true
を明示しなければならない。
カラムにNN制約をかけたい
$ bin/rails g migration ChangeColumnToNotNull
db/migrate/2018xxxxxxxxxx_change_column_to_not_null.rb
class ChangeColumnToNotNull < ActiveRecord::Migration[5.1]
def up
change_column :users, :name,:string, null: false
end
def down
change_column :users, :name,:string
end
end
null: true
と書く必要はありません。
カラムにかけたNN制約を外したいとき
$ bin/rails g migration ChangeColumnToAllowNull
db/migrate/2018xxxxxxxxxx_change_column_to_allow_null_.rb
class changeColumnToAllowNull < ActiveRecord::Migration[5.1]
def up
change_column :users, :name,:string, null: true # null: trueを明示する必要がある
end
def down
change_column :users, :name,:string, null: false
end
end
null: true
と書く必要があります。
理由
Railsでは、カラムのデフォルトはnull: true
(NN制約なし)です。
このため、NN制約をかける際にmigrationのdown
メソッドにnull: true
と書く必要はありません(デフォルト値が入る)。
しかし、いったんnull: false
にしたあとnull: true
にしたいときは明示する必要があります。
ActiveRecordの下記の実装がヒントでした。
rails/activerecord/lib/active_record/migration/command_recorder.rb
196 def invert_change_column_null(args)
197 args[2] = !args[2]
198 [:change_column_null, args]
199 end
2番目の引数がtrue
だったらfalse
に、false
だったらtrue
にするので、引数にnull: true
またはnull: false
を指定する必要があります。