質問: Rails初心者です。 マイグレーションの仕組みについて教えて下さい。 以下のようなことを先輩に教えてもらいました。 「Railsは、マイグレーションファイルとschema_migrationsテーブルを比較して 未実行のマイグレーションを自動的に見つけて実行する」 そこで私はすでに実行されている複数のマイグレーションファイルのひとつにおいて 以下の作業をしました。 実行前 ``` t.string :name t.string :email t.string :address ``` 実行後 ``` t.string :name t.string :address ``` emailの行を削除したのです。 その上で、rake db:migrateを実行しました。 私の予想では、schema.rbにおいて、emailのカラムが削除されると思っていましたが 結果的には変化はありませんでした。 逆に、カラムをひとつ追加しても結果は同じでした。 これはなぜでしょうか? ※カラムを追加/削除する方法として適切ではないことは知っていますが、どういう理屈なのかが知りたいのです。
回答: schema_migrationsテーブルにはマイグレーションファイルの「バージョン」部分が入っています。バージョンは、通常は db/mgirate/タイムスタンプ_マイグレーション名.rb のタイムスタンプ部分の値。 テーブルにバージョンが入っていれば適用済みと判断されます。一方でファイルの内容や修正時刻は見ていませんので、内容を書き換えても未実行とは判断されません。 どのマイグレーションファイルが適用されるかは、 db:migrate:status タスクでも確認できます(downと表示されるもの) スキーマ定義ファイルを書き換えると適用してくれるツールとして、 ridgepole というものもあります。