【Rails】カラムのデフォルト値変更時にロールバックが失敗する原因と対策

Ruby on Rails
記事内に広告が含まれています。

Railsでは change_column_default を使うことで、カラムのデフォルト値を変更することができます。
ただし、マイグレーションを記述する際に少し注意が必要な点があります。それはロールバック時の挙動です。

今回は、実際の書き方とあわせて、書き方次第では rollback できなくなる可能性があるという点について解説します。

基本の書き方

まず、Railsのマイグレーションでカラムのデフォルト値を変更する基本的な書き方はこちらです。

class ChangeDefaultToPublishedOnArticles < ActiveRecord::Migration[7.0]
  def change
    change_column_default :articles, :published, from: false, to: true
  end
end

このように from:to: を明示的に指定することで、マイグレーションの内容が明確になります。

:articles:これはテーブル名で、ブログ記事などを管理するためのテーブルを想定しています。

:published:これはカラム名で、記事が公開されているかどうかを示すブール値(true または false)のカラムを想定しています。

rollbackができなくなる例

一方、from:to: を指定せずに書いてしまうと、以下のようになります。

class ChangeDefaultToPublishedOnArticles < ActiveRecord::Migration[7.0]
  def change
    change_column_default :articles, :published, true
  end
end

この書き方でも db:migrate は正常に通りますが、db:rollback ができません。

なぜなら、change メソッドは reversible(可逆的)なマイグレーションを自動的に生成しますが、from / to を指定しない場合、元のデフォルト値が何だったかRails側で把握できないため、元に戻す処理が自動生成できないのです。

まとめ

  • change_column_default を使ってカラムのデフォルト値を変更できる
  • from: と to: を省略すると rollback できない可能性がある

これらのポイントを意識することで、マイグレーションの可逆性が保たれ、より安全な開発が可能となります。

最後までお読みいただきありがとうございました。

皆さんからのコメントやSNSでのシェア、嬉しい投稿をいただくと本当に励みになります。

もしこの記事が気に入ったら感想をコメントやSNSでシェアしていただけると嬉しいです。

皆さんの声を聞かせてくださいね!

Ruby on Rails
tetsuをフォローする
簿記はじめるってよ

コメント

タイトルとURLをコピーしました