2016-04-10 11 views
1

Ich habe gerade einen DB-Dump geladen und nicht nur Tabellen erstellt und die Daten in diese Tabellen geladen, sondern auch viele Migrationen durchgeführt.Woher weiß Rails, dass eine Migration durchgeführt wurde?

Und nach dem Ausführen der verbleibenden Migrationen, running rake db:migrate:status sagt mir, dass der Status jeder Migration ist UP, aber die Migrationen haben nicht wirklich getan, was sie tun sollen.

Zum Beispiel habe ich eine Migration, die eine Tabelle namens notes erstellt. Es wurde aktualisiert, und die Tabellen notes existieren nicht. Also musste ich diese Migration redo, aber den Code in self.down Methode kommentieren.

Meine Frage ist: Wie kann eine Migration in UP Status sein, obwohl die Tabelle, die es erstellt, wurde nicht in der Datenbank erstellt. Oder ich denke, die db-dumme, die ich zuvor geladen habe, hat schema_migrations Tabelle so besiedelt, dass Rails überwiegende Migrationen in Betracht ziehen, aber tatsächlich nicht.

Jetzt brauche ich manuell zu rake db:migrate:redo VERSION=xxxxxxx jede Migration, oder gibt es eine bessere Lösung?

Antwort

3

Rails fügt Ihrem Schema eine Tabelle namens schema_migrations hinzu, die den Zeitstempel jeder Migration in einer einzelnen Spalte speichert. Es wird nicht in schema.rb angezeigt, aber Rails wird die Zeitstempel in db/migrate und den Zeitstempel von schema.rb mit den Werten der Tabelle schema_migrations vergleichen, um festzustellen, welche Migrationen ausgeführt wurden.

enter image description here

+1

Das ist wahr! Der Quellcode für diese Implementierung finden Sie hier https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake#L91 – Pavan

0

Rails verwendet Rack Middleware ActiveRecord::Migration::CheckPending, um das zu tun.

Sie können alle Rack-Midwardware anzeigen, die Rails verwendet, indem Sie rack middleware in Ihrer Konsole ausführen.

+0

beantworten Dies gilt nicht für Frage. –

+0

Ich glaube, ich habe deine Fragen missverstanden. Ich denke, dass es in der Rails-Umgebung einige Konflikte geben sollte, z. Möglicherweise müssen Sie den Test RAILS_ENV = angeben, wenn Sie versuchen, eine Datenbank in Testumgebung zu erstellen. – qcam

Verwandte Themen