Rails カラムのデフォルト値や not null 制約を変更する

既存のデータベーステーブルの特定のカラムについて、マイグレーションファイルを使って後からデフォルト値や not null 制約を設定する方法。

(共通手順)

  1. マイグレーションファイルを作り、
  2. マイグレーションファイルを編集。
  3. bin/rails db:migrate でデータベースに反映させる。

デフォルト値を設定する

書式

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

ロールバックも可能。

ActiveRecord::ConnectionAdapters::SchemaStatements

Active Record マイグレーション - Railsガイド