Open4

Ralls やってはいけない集 ~マイグレーション編~

chihasochihaso

既存のマイグレーションを変更してはいけない

マイグレーションは積み重ねなので、既存のマイグレーションを変更したり削除したりすると、ゼロからraild db:migrateし直した時に最終的なスキーマが変化してしまう恐れがある。

chihasochihaso

ロールバックを考慮しないマイグレーションを追加してはいけない

特に削除系のマイグレーションでは、remove_column: <カラム名>とかdrop_table: <テーブル名>みたいに単純に削除対象だけ記載すると、ロールバックしたとき型やオプションやカラムがわからないので元に戻せなくなる。
ちゃんとオプションまで含めて記載することで元に戻せるようになる。
基本的にマイグレーションを追加する時は、ロールバックしたときにスキーマが元に戻ることを確認した上で追加する。
(それでも一度削除すればレコードは消えることに注意)
この辺は記事にまとめた -> https://zenn.dev/chihaso/articles/e27a717a0922cf

chihasochihaso

マイグレーションの中で自前のクラスやメソッドを呼んではいけない

マイグレーションファイルは基本的に変更されずに残り続ける。
一方で自前のクラスやメソッドは削除されたり振る舞いが変更されたりする。
例えばマイグレーションファイルの中で呼んだクラスをあとから削除した場合、再度マイグレーションをやり直そうとすると、すでに存在しないクラスを参照しようとするのでエラーが発生する。
基本的にマイグレーションファイルの中ではRubyやRailsに元から備わっているクラス、メソッドだけを使用する。(それでもバージョンアップで消えたりすればエラーのリスクはあるが)

chihasochihaso

rails db:setupとかだったらマイグレーションせずスキーマダンプから作れるのでその手もある?
でもマイグレーションの中で初期データの生成みたいなことしてると実行されなくなってしまう(それもアンチパターンだろうけど)。