マイグレーションファイルであるテーブルのカラムを追加する際に、default: 0と記載してカラムの追加を行った。その際のエラーについてまとめておく。
エラーの内容
エラーの内容は以下。
Mysql2::error: Column '*********' cannot be null
内容としては、このカラムにはnullは許可されていませんというようなもの。
default: 0としたマイグレーションファイルの内容
class AddPriorityposts < ActiveRecord::Migration[5.2]
def change
add_column :posts, :priority, :integer, null: false, default: 0
end
end
こんな感じでPostテーブルに新たにpriorityというカラムを追加する必要があった。その際に、default: 0という設定を記載した。
default値は新規作成の時だけ適用される
default値は新規作成の時にだけ適用されるらしい。
この記事のコードはPostテーブルに関しての内容だが、要するにPostのレコードを新規作成するときにだけpriorityの値が空欄だとしても、0がpriorityの値として登録される。
では、default値を設定していてもなぜMysql2::error: Column '********' cannot be null
というエラーがでるタイミングがあるのか。
更新のタイミングではdefault値は適用されない
新規作成のタイミングでは、priorityにはdefault値が0として登録される。しかし、このpriorityの値を更新するタイミングでは、default: 0は無視されてしまう。そのため、priorityをフォームなどで空白として更新をしてしまうとMysql2::error: Column '******' cannot be null
というようなエラーがでてしまう。
このエラーの対処法
対処法1
モデルにpresence: trueを記載する。これにより、その値の更新時に空は登録できなくなりそもそも更新の段階でバリデーションエラーが表示される。
対処法2
モデルに明示的に空が渡されている時は0を渡すというようなコードを記載する。
コード例
self.priority = 0 if priority.blank?
このような感じでもしpriorityが空の場合はpriorityは0とするというように明示的にコードをかいてあげると良さそう。