Rails Modell Validatoren frühere Migrationen brechen
-
09-06-2019 - |
Frage
Ich habe eine Folge von Migrationen in einer Rails-Anwendung, die die folgenden Schritte umfasst:
- Erstellen Basisversion des 'user' Modell
- Erstellen Sie eine Instanz dieses Modells - es muss mindestens einen Anfangs Benutzer in meinem System sein, so dass Sie sich anmelden können und starten Sie es mit
- Aktualisieren Sie die ‚Nutzer‘ Modell ein neues Feld / Spalte hinzuzufügen.
Nun bin ich „validates_inclusion_of“ auf diesem neuen Feld / Spalte. Das funktionierte auf meinem ersten Entwicklungsmaschine, die bereits angewendet, um eine Datenbank mit diesen Migrationen hatte. wenn ich auf eine frische Maschine jedoch gehen und alle Migrationen laufen, Schritt 2 fehlschlägt, weil validates_inclusion_of fehlschlägt, weil das Feld von Migration 3 wurde noch auf die Modellklasse hinzugefügt.
Als Abhilfe kann, kann ich die „validiert _...“ Zeile aus kommentieren, die Migrationen laufe, und Kommentar- es, aber das ist nicht schön.
Besser wäre wieder um meine Migrationen so die Erstellung eines Benutzers (Schritt 2) zuletzt kommt, nachdem alle Spalten hinzugefügt wurden.
Ich bin zwar ein Neuling Schienen, so dass ich dachte, ich würde fragen, was der bevorzugte Weg, um diese Situation zu handhaben ist:)
Lösung
Der einfachste Weg, um dieses Problem zu vermeiden, ist rake db zu verwenden: Schema: Last auf der zweiten Maschine, statt db: wandern. D: S:. L verwendet schema.rb die aktuellste Version Ihres Schemas zu laden, im Gegensatz zu ihm Form kratzen Migration bis
Wenn Sie in diese Ausgabe ausgeführt werden, wenn auf eine Produktionsmaschine bereitstellen (wo die Erhaltung Daten wichtig ist), werden Sie wahrscheinlich Ihre Migrationen in eine einzige Datei, ohne Konflikte zu konsolidieren.
Andere Tipps
Sie können eine Klasse mit dem gleichen Namen in der Migration erklären, wird es Ihre app / model einer außer Kraft setzen:
class YourMigration < ActiveRecord::Migration
class User < ActiveRecord::Base; end
def self.up
# User.create(:name => 'admin')
end
end
Leider ist Ihre IDE versuchen, auf diese Klasse automatisch zu vervollständigen basiert (Netbeans der Fall ist), und Sie können Ihr Modell Logik dort nicht verwendet werden (außer wenn Sie es duplizieren).
Ich habe dieses Recht jetzt zu tun. Aufbauend auf Bihi Rat, ich bin das Modell Laden manuell dann Methoden neu zu definieren, wo es nötig ist.
load(File.join(RAILS_ROOT,"app/models/user.rb"))
class User < ActiveRecord::Base
def before_validation; nil; end # clear out the breaking before_validation
def column1; "hello"; end # satisfy validates_inclusion_of :column1
end