2016-04-10 9 views
1

私はDBダンプを読み込んだだけで、テーブルを作成しただけでなく、それらのテーブルにデータをロードしただけでなく、多くのマイグレーションが行われました。Railsは移行が実行されたことをどのように知っていますか?

残りの移行を実行した後で、rake db:migrate:statusを実行すると、移行のステータスはUPであることがわかりますが、移行は実際には実行されていません。

たとえば、notesという表を作成する移行があります。 up'edされており、テーブルnotesは存在しません。だから私はredoこのマイグレーションに持っていたが、self.downの方法でコードをコメントアウトしていた。

私の質問は次のとおりです。作成しようとしているテーブルがデータベースに作成されていないにもかかわらず、移行がUPステータスになることがあります。または、以前にロードしたDBダムが、schema_migrationsというような方法でテーブルにデータを格納していて、Railsはほとんどの場合移行がアップしていると考えているが、実際はそうではないと思う。

これで、手動で各マイグレーションをrake db:migrate:redo VERSION=xxxxxxxする必要がありますか、それともより良い解決策がありますか?

答えて

3

Railsはスキーマにschema_migrationsという名前のテーブルを追加します。これは、各移行のタイムスタンプを1つの列に格納します。 schema.rbには表示されませんが、db/migrateのタイムスタンプとschema.rbのタイムスタンプをschema_migrationsテーブルの値と比較して、どのマイグレーションが実行されたかを判断します。

enter image description here

+1

でデータベースを作成しようとしている場合に備えて、RAILS_ENV = testを指定する必要があります。これは本当です!この実装のソースコードは、https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake#L91にあります。 – Pavan

0

Railsでは、ラックミドルウェアActiveRecord::Migration::CheckPendingを使用しています。

コンソールでrack middlewareを実行すると、Railsが使用しているすべてのRackミドルウェアを表示できます。

+0

これは質問ではありません。 –

+0

私はあなたの質問を誤解していると思います。 Rails環境にはいくつかの矛盾があるはずです。 test env – qcam

関連する問題