質問: Rails で開発していてブランチを切り替えたときに毎回マイグレーションが実行されてしまい すでに存在している create_table や add_column がエラーになるので マイグレーションディレクトリを消して対処してるんですが これを回避するにはどうするのがいいのでしょうか マイグレーションは数百にのぼるのですべての add_column, create_table の前に存在チェックしてスキップコードをいれるのは大変で add_column, create_table を存在する場合にスキップするようにオーバーライドしたモジュールかクラスを作って ``` class xxx < MyMigration ``` とか ``` class xxx < ActiveRecord::Migration include CheckedMigration ``` と1行ずつはさんでいくならなんとか手作業でもできるかなという感じなんですが この2つだとどちらのほうがいいでしょうか あるいはもっと簡単に行うことはできますか?
回答: 方法論として そのどちらも、新しいMigrationを追加したときに忘れると思います よって初期化あたりで、ActiveRecord::Migration 自体を上書き拡張する方法もあります ただし本番で本当に不正なmigrateが動くときに気づかないのは問題なので開発限定にすべきでしょう config/initializers/develop_checked_migration.rb ``` if Rails.env.development? ActiveRecord::Migration.send(:prepend, Module.new do def create_table(*args) ## 既存があればスキップ super end end) end ``` そもそもMigrationが動くのが間違い `db/20170921042237_create_hoges.rb` という migration ファイルが有った場合に schema_migrations テーブルに `20170921042237` というデータがあればその migrationは動きません これは **Railsのデフォルト** 機能であり、ブランチ切り替えで動くならRailsのレールを外れる何かをしていませんか? 例えば、ブランチ切り替えて、開発データを作り直す際に schema_migrations まで消してしまうとか もしくは、日付ではなく自前の連番を付けて、ブランチごとに並び替えが多発しているとか 一番良いのは、そのような発生原因を潰すべきだと思います