3

最後の移行を元に戻すのに問題があります。

評価のために「letrate」ジェムをインストールして以来、期待どおりの最後の移行ではなく、rake db:rollback正確にそのletrate gem移行を元に戻します。

これは宝石自体によるものではないと思います。

これを修正する方法はありますか?非常に便利なロールバックを楽しむことができますか?

同じ問題は次のとおりです。

rake db:migrate:redo

結果:

==  CreateRates: reverting ====================================================
-- drop_table(:rates)
   -> 0.0224s
==  CreateRates: reverted (0.0225s) ===========================================

==  CreateRates: migrating ====================================================
-- create_table(:rates)
NOTICE:  CREATE TABLE will create implicit sequence "rates_id_seq" for serial column "rates.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "rates_pkey" for table "rates"
   -> 0.1787s
-- add_index(:rates, :rater_id)
   -> 0.0032s
-- add_index(:rates, [:rateable_id, :rateable_type])
   -> 0.0024s
==  CreateRates: migrated (0.1850s) ===========================================

レーキ データベース:移行:ステータス

...
   up     20121205224038  Rename user address column
   up     20121206125016587  ********** NO FILE **********
   up     20121206125016605  ********** NO FILE **********
   up     20121210152550  Create reservations
   up     20121210180233  Create transactions
   up     20121210215840  ********** NO FILE **********
   up     20121218144200  Create videos
   up     20121218144800  Add video to videos
   up     20130108225007  Devise invitable add to users
   up     20130130202046  Acts as taggable on migration
   up     20130205154206  Create commissions
   up     20130207133520  Add user id to event transition

とファイル

-rw-r--r--@  1 joel  staff   137 Dec  7 16:40 20121205224038_rename_user_address_column.rb
-rw-r--r--@  1 joel  staff   443 Dec  7 16:40 20121206125016587_create_rating_caches.rb
-rw-r--r--@  1 joel  staff   432 Dec  7 16:40 20121206125016605_create_rates.rb
-rw-r--r--@  1 joel  staff   429 Dec 10 23:30 20121210152550_create_reservations.rb
-rw-r--r--@  1 joel  staff   414 Dec 10 19:03 20121210180233_create_transactions.rb
-rw-r--r--@  1 joel  staff   237 Dec 18 15:44 20121218144200_create_videos.rb
-rw-r--r--@  1 joel  staff   172 Dec 18 16:18 20121218144800_add_video_to_videos.rb
-rw-r--r--@  1 joel  staff   758 Jan  8 23:50 20130108225007_devise_invitable_add_to_users.rb
-rw-r--r--   1 joel  admin   775 Jan 30 21:20 20130130202046_acts_as_taggable_on_migration.rb
-rw-r--r--@  1 joel  admin   422 Feb  5 17:05 20130205154206_create_commissions.rb
-rw-r--r--@  1 joel  admin   266 Feb  7 15:20 20130207133520_add_user_id_to_event_transition.rb
4

1 に答える 1

6

OK、問題は letrate 移行のバージョン番号です。Rails は、移行ファイルのタイムスタンプを並べ替えて、最近適用されたものを認識します。タイムスタンプにさらに 3 桁あるため、20121206125016605_create_rates.rb20121206125016587_create_rating_cachesは常に最後の移行として検出されます。

それを修正して、移行のステータスをクリーンアップしてみましょう。最初に問題のある移行をロールバックします。

rake db:rollback STEP=2

次のrake db:migrate:statusようになります。

up     20121205224038  Rename user address column
up     20121210152550  Create reservations
up     20121210180233  Create transactions
up     20121210215840  ********** NO FILE **********
up     20121218144200  Create videos
up     20121218144800  Add video to videos
up     20130108225007  Devise invitable add to users
up     20130130202046  Acts as taggable on migration
up     20130205154206  Create commissions
up     20130207133520  Add user id to event transition

バージョン番号を修正しましょう (移行がデフォルトdb/migrateフォルダにあると仮定します) 。

mv db/migrate/20121206125016605_create_rates.rb db/migrate/20121206125017_create_rates.rb
mv db/migrate/20121206125016587_create_rating_caches.rb db/migrate/20121206125016_create_rating_caches.rb

db:migrate:statusこれで、次のようになります。

up     20121205224038  Rename user address column
down   20121206125016  Create rating caches
down   20121206125016  Create rates  
up     20121210152550  Create reservations
up     20121210180233  Create transactions
up     20121210215840  ********** NO FILE **********
up     20121218144200  Create videos
up     20121218144800  Add video to videos
up     20130108225007  Devise invitable add to users
up     20130130202046  Acts as taggable on migration
up     20130205154206  Create commissions
up     20130207133520  Add user id to event transition

「タイムライン」は修正されましたが、これらの移行を再適用する必要があります。rake db:migrate最後の移行は現在20130207133520_add_user_id_to_event_transition.rbであり、既に適用されているため、rake は最新の状態であると認識downしているため、動作しません。メソッド内のすべてをコメント化して出力します。メソッドしかない場合はchange、コメントして空の up メソッドと down メソッドを作成します。したがって、これらすべての down メソッドは次のようになります。

def down
  # This is the old code
  # which I will uncomment later...
end

また、ファイルが関連付けられていない奇妙な移行 ( ********** NO FILE **********1 つ) があるため、空の移行を作成する必要があります。したがって、次の内容でdb/migrate/20121210215840_ghost_migration.rbという名前のファイルを作成します。

class GhostMigration < ActiveRecord::Migration
  def up
  end

  def down
  end
end

これで、ロールバックをシミュレートする準備が整いました。そうする

rake db:rollback STEP=9

移行ステータスの出力は次のようになります。

up     20121205224038  Rename user address column
down   20121206125016  Create rating caches
down   20121206125016  Create ratings
down   20121210152550  Create reservations
down   20121210180233  Create transactions
down   20121210215840  Ghost migration
down   20121218144200  Create videos
down   20121218144800  Add video to videos
down   20130108225007  Devise invitable add to users
down   20130130202046  Acts as taggable on migration
down   20130205154206  Create commissions
down   20130207133520  Add user id to event transition

これで、以前にコメントした内容のコメントを解除し、「Ghost migration」ファイルを削除することで、ファイルを元の状態に戻すことができます。実際には、前に down メソッドで行ったのと同じ方法で「up」メソッドをコメントし、「Ghost migration」ファイルを削除して、すべてを移行する必要があります。

rake db:migrate

最後に、ファイル内でコメントアウトしたすべてのコメントを解除すると、その後はスムーズに実行されるはずです (願っています)。

そもそもなぜこれが起こったのかについては、これは実際にはgem自体によるものだと思います。私の意見では、無効な(または少なくとも非標準の)バージョン番号で移行を生成すべきではありません。gem が同じ秒で 2 つの移行を生成するように見えるので、作成者がバージョン番号の衝突を防ぐためにこれらの 3 桁を追加したのかもしれません。すべてを同じ移行で行う方がよかったと思います。

これが問題の解決に役立つことを願っています!

アップデート

多分私は物事を複雑にしすぎました。実際にすべての移行をロールバックしてから再度移行することを気にしない場合は、どのファイルにもコメントする必要はありません (ただし、「ゴースト移行」トリックは引き続き必要です)。この方法の方が安全だと感じました。

于 2013-02-16T16:44:25.847 に答える