Frage

Ich habe eine Folge von Migrationen in einer Rails-Anwendung, die die folgenden Schritte umfasst:

  1. Erstellen Basisversion des 'user' Modell
  2. 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
  3. 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:)

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top