既存のデータベーステーブルの特定のカラムについて、マイグレーションファイルを使って後からデフォルト値や not null 制約を設定する方法。
(共通手順)
デフォルト値を設定する
書式
change_column_default(テーブル名, カラム名, from: 元のデフォルト値, to: 新しいデフォルト値)
例
posts テーブルの state カラム(デフォルト値なし)に、デフォルト値"draft"
を設定する。
まず、マイグレーションファイルを作る。
$ bin/rails g migration ChangeColumnToPosts
マイグレーションファイルを編集。
20200812XXXXXX_change_column_to_posts.rb
class ChangeColumnToPosts < ActiveRecord::Migration[6.0] def change change_column_default(:posts, :state, from: nil, to: "draft") end end
このとき、change_column_default(:posts, :state, "draft")
と書くこともできるが、その場合ロールバックができなくなる。
from: 元のデフォルト値, to: 新しいデフォルト値
としておけばロールバック可能。
設定済みのデフォルト値を外す場合は、nil
に変更する。
ActiveRecord::ConnectionAdapters::SchemaStatements
not null 制約をつける
書式(not null 制約をつける)
change_column_null テーブル名, カラム名, false
例
comments テーブルの body カラム(not null 制約なし)に、not null 制約をつける。
まず、マイグレーションファイルを作る。
$ bin/rails g migration ChangeColumnNullOnComments
マイグレーションファイルを編集。
20200812XXXXXX_change_column_null_on_comments.rb
class ChangeColumnNullOnComments < ActiveRecord::Migration[6.0] def change change_column_null :comments, :body, false end end
change_column_null テーブル名, カラム名, false
で、not null 制約をつけることができる。
not null 制約を外す場合は、change_column_null テーブル名, カラム名, true
。
ロールバックも可能。