1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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 できない可能性がある

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?