2016-08-02 25 views
1

In Rails, manchmal bekommen wir den FehlerWoher weiß Rails, dass Migrationen ausstehen?

ActiveRecord::PendingMigrationError

Wie Rails wissen Migrationen anhängig sind?

Wo wird diese Flagge/Information gespeichert?

+0

Überprüfen Sie Ihre Datenbank, gibt es eine Tabelle 'schema_migrations'. Siehe [die Dokumente] (http://api.rubyonrails.org/classes/ActiveRecord/Migration.html) und [verwandte Frage] (http://stackoverflow.com/questions/12057408/how-does-rails-keep- Track-of-which-migrations-run-for-a-database? rq = 1) –

Antwort

1

Wenn das Modell oder die Migration erstellt wird, wird dem Dateinamen ein Zeitstempel hinzugefügt.

  20160727050119_create_user.rb 
     #time-stamp 20160727050119 

Dann Verfahren call(env), die der letzten Migration Tempel abzurufen.

 `mtime = ActiveRecord::Migrator.last_migration.mtime.to_i` 

und vergleichen Sie es mit @last_check und wenn es weniger als mtime

check_pending! genannt wird und ActiveRecord::PendingMigrationError gezeigt.

 ActiveRecord::Migration.check_pending!(connection) 

check_pending!

 def check_pending!(connection = Base.connection) 
     raise ActiveRecord::PendingMigrationError if ActiveRecord::Migrator.needs_migration?(connection) 
     end 

können Sie all diese Informationen finden .../lib/active-record/migration.rb

+0

Nützliche Informationen und erläutert ein Problem, das ich hatte: Wenn Sie Ihre schema.rb-Datei festschreiben und nicht die Version festschreiben Parameter zu 'ActiveRecord :: Schema.define' am Anfang der Datei zusammen mit Ihren anderen Änderungen, kann es andere (in meinem Fall das CI-System) veranlassen, den ausstehenden Migrationsfehler zu erhalten, wenn sie versuchen, die Tests auszuführen, weil der Die Schemaversion ist kleiner als der Zeitstempel der letzten Migration. – Leo

0

Es gibt eine Tabelle in der Datenbank Ihrer Anwendung schema_migrations genannt, die eine einzelne Spalte namens Versionen hat. Für jede durchgeführte Migration wird eine Zeile angezeigt. Wenn auf der CD eine Migrationsdatei vorhanden ist, deren Zeitstempel nicht in der Tabelle schema_migrations enthalten ist, weiß Rails, dass Migrationen ausgeführt werden müssen.