2012-04-09 2 views
1

Ich generiert eine Rails 3.2 Migration mit einer leeren Funktion, da die Migration irreversibel ist (und ich möchte keine Ausnahme auslösen). Ich führe die Migration erfolgreich durch, aber es hat keine Auswirkungen. Wenn ich Rollback und db: migrate erneut ausführen, gelten die Effekte.Schienen-Migration funktioniert nicht mit einer leeren Funktion abbrechen

Ich löste das leicht, indem ich die leere Funktion mit einem Code füllte, der nichts tut, aber immer noch ziemlich hässlich ist.

Weiß jemand, warum das passiert? Ist das ein Schienenfehler?

+2

@SergioTulentsev wahr, aber obwohl einige Leute für Frage und Landung hier googeln, verdienen eine Antwort;) – Ernest

+0

danke, war mir nicht einmal bewusst stackoverflow hatte eine Funktion akzeptieren, bis vor ein paar Wochen :) – Indigon

Antwort

6

Die Ausnahme wird geworfen, um zu verhindern, dass Ihre Datenbank zerstört wird, wenn es irreversibel ist, dann ist das wahrscheinlich das Richtige. Ihre #down könnte wie folgt aussehen:

def down 
    raise ActiveRecord::IrreversibleMigration, "Explain why its irreversable!" 
    end 

, die andere eine Menge Kopfschmerzen sparen, da es meldet deutlich über irreversable Migration und erklärt den Grund dahinter :)

EDIT: ich nicht bestätigen kann Verhalten für Schienen 3.2.3. Ich habe mehrere verschiedene Migrationen ohne #down erstellt, und keine Exception wurde ausgelöst. Vielleicht ist es etwas in deinem Code, das du nicht gezeigt hast.

EDIT 2: Nur zur Erinnerung, wenn Sie mit up/down-Methode, seine Ihre Verantwortung ActiveRecord::IrreversibleMigration zu erhöhen. In anderen Fällen wird nichts passieren (#down definiert in AR wird nur Null zurückgeben). Das Verhalten ist anders, wenn Sie #change verwenden. In einigen Fällen kann die erwähnte Ausnahme durch #inverse ausgelöst werden, die hier definiert ist: https://github.com/rails/rails/blob/565bfb9cd49285ebaa170141b4996c22ba81de43/activerecord/lib/active_record/migration/command_recorder.rb#L39 was erwartetes Verhalten ist.

+0

Dies ist wahrscheinlich die richtige Lösung, aber es beantwortet nicht das Verhalten, das ich beschrieben habe :) – Indigon

+0

@Indigon aktualisiert. – Ernest