運用中のRailsアプリケーションからカラムを削除したい

イタンジ株式会社 野澤です。 普段Railsを使って開発をしています。

この記事では、Railsで扱っているカラムを削除する方法について紹介します。

なぜ書くか

・Railsからカラムを削除する機会があったため
・カラムを削除することがそうそうあるものではなく、いざやろうと思った時にどういう手順で何に注意してやれば良いか思い出せない

やり方

1. 削除予定のカラムをRailsから参照しないようにする
2. カラムを削除
3. ignore_colmunsの記述を削除する

※ 各手順ごとにリリース

1. 削除対象のカラムをRailsから参照しないようにする

削除予定のカラムの記述をソースコードから全て削除します。

加えて削除対象のカラムをignored_columnsに指定します。

class Hoge < ApplicationRecord
  self.ignored_columns = %i[fuga]
end

ignored_columnsについて参考: 稼働中RailsアプリのDBに対してカラム追加・削除する - Qiita

ここまで修正したものをリリースします。

2. カラムを削除

ログを確認し、削除したいカラムを参照しているSQLが発行されていないことを確認します。 問題なければカラムを削除していきます。

私が携わっているプロダクトではridgepoleを使用していたため、
Schemafileからカラム行を削除して対応しました。

create_table 'hoges', force: :cascade, options: 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4' do |t|
-   t.string  'fuga'
  t.timestamps
end

ここまで修正したものをリリースします。

3. ignored_columnsの記述を削除する

上記が完了したら最後にignored_columnsの記述を削除します。

修正したものをリリースします。

ignored_columnsが必要な理由

アプリケーションとマイグレーションの反映が同期的でない場合、
マイグレーションが先に完了してカラムが削除されてしまうと、Rails側でキャッシュされたschema情報が古いカラムを持ったままなので、モデルにアクセスしようとした際にUnknown columnエラーが発生します。

そのため、あらかじめignored_columnsを入れて該当カラムを参照するSQLが発行されないようにしています。

まとめ

以上、カラムを削除する機会があったのでやり方についてまとめてみました。
なかなかカラムを削除する機会はないと思い、必要になった人に届いたら良いなという記事でした。