rake db:migrate を実行した際、一部のマイグレーションだけ行われず、コンソールに何の表示も出ない場合

rails2 でハマったので書いておく。rails3 は知らん。

通常 rake db:migrate を実行すると、以下のようなログが出る。

user@localhost$ rake db:migrate
== 100 HogeHoge1: migrating =============================================
-- add_column(:unkos, :smell, :string, {:null=>false, :default=>"unko"})
  -> 0.0037s
== 100 HogeHoge1: migrated (0.0037s) ====================================

== 101 HogeHoge2: migrating =============================================
-- add_column(:unkos, :comment, :string, {:null=>false, :default=>"unko"})
  -> 0.0037s
== 101 HogeHoge2: migrated (0.0037s) ====================================

== 102 HogeHoge3: migrating =============================================
-- add_column(:unkos, :color, :string, {:null=>false, :default=>"unko"})
  -> 0.0037s
== 102 HogeHoge3: migrated (0.0037s) ====================================

user@localhost$

のだが、ケースによっては一部のマイグレーションファイルが全く何の反応もなく終了する場合がある。このとき rake db:migrate --trace をしてみても何の例外も出ていない。例えば以下のような感じで、ごっそり途中のマイグレーションが抜け落ちたりする。

user@localhost$ rake db:migrate
== 100 HogeHoge1: migrating =============================================
-- add_column(:unkos, :smell, :string, {:null=>false, :default=>"unko"})
  -> 0.0037s
== 100 HogeHoge1: migrated (0.0037s) ====================================

== 102 HogeHoge3: migrating =============================================
-- add_column(:unkos, :color, :string, {:null=>false, :default=>"unko"})
  -> 0.0037s
== 102 HogeHoge3: migrated (0.0037s) ====================================

user@localhost$

このような場合、migrate のクラス名が重複しているケースがあるので、新規追加・修正したマイグレーションファイルのクラス名が既に存在するクラス名と被らないかどうか確認する。

101_hoge_hoge2.rb | class HogeHoge2 < ActiveRecord::Migration
105_hoge_hoge2.rb | class HogeHoge2 < ActiveRecord::Migration

上記のようなケースは、ファイル名は違うものの、クラス名が一緒になっており、これを順番通り実行するとなぜか 101_hoge_hoge2.rb が実行されない。105_hoge_hoge2.rb 側のクラス名(とできればファイル名)を修正する必要がある。

これで小一時間ハマりました。ていうか警告ぐらい出せ。