概要
Railsの既にレコードが存在しているテーブルにnull falseを指定したカラムを追加したいと思った時の挙動について。
結論
null: false に加えて default
を指定してあれば、既に存在しているレコードにはdefault値がセットされるため、マイグレーションでカラムを追加してもエラーになりません。
実行内容
マイグレーションファイル内容
class AddColumnToUser < ActiveRecord::Migration[5.1]
def change
add_column :users, :send_status, :integer, limit: 2, default: 0, null: false, comment: '送信ステータス 0:送信前, 1:送信済, 2:送信失敗'
end
end
実行結果
miagration実行前のテーブルのレコード
+----+------------+-----------------+---------------------+--------+------------+------------+--------------+---------------------+---------------------+-------------+
| id | account_id | lock_version | created_at | updated_at
+----+------------+-----------------+---------------------+--------+------------+------------+--------------+---------------------+---------------------+-------------+
| 1 | 722672863 | 1 | 2018-08-21 10:22:24 | 2018-08-21 10:48:57
| 2 | 722672863 | 0 | 2018-08-21 11:00:23 | 2018-08-21 11:00:23
+----+------------+-----------------+---------------------+--------+------------+------------+--------------+---------------------+---------------------+-------------+
migration実行後のテーブルのレコードの状態
+----+------------+-----------------+---------------------+--------+------------+------------+--------------+---------------------+---------------------+-------------+
| id | account_id | lock_version | created_at | updated_at |send_status |
+----+------------+-----------------+---------------------+--------+------------+------------+--------------+---------------------+---------------------+-------------+
| 1 | 722672863 | 1 | 2018-08-21 10:22:24 | 2018-08-21 10:48:57 | 0 |
| 2 | 722672863 | 0 | 2018-08-21 11:00:23 | 2018-08-21 11:00:23 | 0 |
+----+------------+-----------------+---------------------+--------+------------+------------+--------------+---------------------+---------------------+-------------+
環境情報
CentOS Linux release 7.4.1708 (Core) (さくらvps)
ruby: 2.4.3(rbenv)
rbenv 1.1.1-28-gb943955
rails 5.0.6
Phusion Passenger 5.2.3
Apache/2.4.6 (CentOS)
Capistrano 3.3.5