Wie füge ich eine check-Einschränkung in einer Rails-migration?
Muss ich hinzufügen, um eine neue integer-Spalte zu einer vorhandenen Tabelle in meiner Rails-app. Die Spalte kann nur Werte 1, 2, 3, so möchte ich hinzufügen einer check-Einschränkung für die Tabelle/Spalte. Wie kann ich festlegen, diese Einschränkung innerhalb einer Rails-migration?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schienen migration stellt keine Methode zum hinzufügen von Constraints, aber Sie können es immer noch tun, über migration, sondern durch die Weitergabe der tatsächlichen SQL execute()
Erstellen, die Migration-Datei:
Nun, in der migration-Datei:
config.active_record.schema_format = :sql
imconfig/application.rb
als "db/schema.rb
nicht express-Datenbank bestimmte Elemente wie Trigger, stored procedures oder check-Einschränkungen.".db/schema.rb
: active_record-postgres-Einschränkungen. Siehe meine Antwort für weitere details. Für jetzt, nur postgres unterstützt.Habe ich gerade gearbeitet, bekommen Sie mit einer PostgreSQL-CHECK constraint, um zu arbeiten.
Nilesh die Lösung ist nicht ganz vollständig; die db/schema.rb-Datei nicht die Einschränkung, so dass tests und alle Bereitstellungen mit db:setup wird nicht die Einschränkung. Als pro http://guides.rubyonrails.org/migrations.html#types-of-schema-dumps
I. e., in config/application.rb eingestellt
Leider, wenn Sie unter Benutzung von PostgreSQL, erhalten Sie möglicherweise eine Fehlermeldung beim laden der resultierende dump, siehe Diskussion bei FEHLER: Sie müssen Eigentümer der Sprache plpgsql. Ich wollte nicht nach unten gehen der PostgreSQL-Konfiguration Pfad in der Diskussion; und ich bin in jedem Fall gerne mit einem lesbaren db/schema.rb-Datei. So dass ausgeschlossen benutzerdefinierte SQL in der migration-Datei für mich.
Den https://github.com/vprokopchuk256/mv-core gem vorgeschlagen von Valera scheint vielversprechend, aber es unterstützt nur eine begrenzte Anzahl von Einschränkungen (und ich bekam eine Fehlermeldung, wenn ich versuchte, es zu benutzen, aber, dass, möglicherweise aufgrund von Inkompatibilitäten mit anderen Schmuckstücken, die ich auch bin).
Die Lösung (hack) ich ging mit, um die Modell-code-legen Sie die Einschränkung. Da es kindof wie eine Validierung, das ist, wo ich Sie:
Natürlich bedeutet dies einen zusätzlichen wählen Sie vor jeder Prüfung; wenn das ist ein problem, eine Lösung wäre, um es in ein "nach Verbindung" monkey patch wie besprochen in Wie zum ausführen von bestimmten Skript nach mit oracle verbunden mit Schienen? (Man kann nicht einfach cache das Ergebnis der select -, weil die überprüfungs - /constraint-Zusatz geschieht im Rahmen einer Transaktion, die möglicherweise ein Rollback ausgeführt, so dass Sie brauchen, um zu überprüfen, jedes mal.)
Können Sie es tun, mit Migration Prüfungen gem. Details siehe hier: https://github.com/vprokopchuk256/mv-core
Mit diesem Schmuckstück werden Sie in der Lage zu definieren, die Einbeziehung der Validierung auf db-Ebene:
außerdem sind Sie in der Lage ist, zu definieren, wie die überprüfung definiert werden sollte, und sogar die Fehlermeldung, die angezeigt werden sollen:
kann man sogar leveln, dass die Validierung von migration direkt auf Ihr Modell:
und dann die Validierung definiert, bei der migration wird auch definiert als ActiveModel Validierung im Modell:
Ich gerade veröffentlicht ein Juwel für dieses: active_record-postgres-Einschränkungen. Als die README es beschreibt, können Sie es mit einem db/schema.rb-Datei, und es fügt Unterstützung für die folgenden Methoden in Migrationen:
Beachten Sie, dass in dieser Zeit nur postgres unterstützt.
Können Sie
Sequel
gem https://github.com/jeremyevans/sequel