Sie sollten text
mit Rails verwenden, wenn Sie eine Zeichenfolge ohne Längenbeschränkung möchten. Eine Migration wie diese:
def up
change_column :your_table, :your_column, :text
end
def down
# This might cause trouble if you have strings longer
# than 255 characters.
change_column :your_table, :your_column, :string
end
sollte die Dinge regeln. Vielleicht möchten Sie auch :null => false
einige andere Optionen am Ende.
Wenn Sie eine string
Spalte ohne explizite Begrenzung verwenden, fügt Rails eine implizite Spalte hinzu :limit => 255
. Wenn Sie jedoch verwenden text
, erhalten Sie den von der Datenbank unterstützten Zeichenfolgentyp beliebiger Länge. Mit PostgreSQL können Sie eine varchar
Spalte ohne Länge verwenden, aber die meisten Datenbanken verwenden dafür einen separaten Typ, und Rails weiß nichts varchar
ohne Länge. Sie müssen text
in Rails verwenden, um eine text
Spalte in PostgreSQL zu erhalten. Es gibt keinen Unterschied in PostgreSQL zwischen einer Spalte vom Typ text
und einem vom Typ varchar
(aber varchar(n)
ist anders). Wenn Sie zusätzlich zu PostgreSQL bereitstellen, gibt es keinen Grund für die Verwendung :string
(AKA varchar
). Die Datenbank behandelt text
undvarchar(n)
das gleiche intern mit Ausnahme der zusätzlichen Längenbeschränkungen für varchar(n)
; Sie sollten varchar(n)
(AKA :string
) nur verwenden, wenn Sie eine externe Einschränkung (z. B. ein Regierungsformular, das besagt, dass das Feld 432 in Formular 897 / B 23 Zeichen lang ist) für die Spaltengröße haben.
Wenn Sie eine string
Spalte irgendwo verwenden, sollten Sie dies immer :limit
als Erinnerung an sich selbst angeben , dass es ein Limit gibt, und Sie sollten eine Validierung im Modell haben, um sicherzustellen, dass das Limit nicht überschritten wird. Wenn Sie das Limit überschreiten, beschwert sich PostgreSQL und löst eine Ausnahme aus, MySQL schneidet die Zeichenfolge leise ab oder beschwert sich (abhängig von der Serverkonfiguration), SQLite lässt sie unverändert passieren und andere Datenbanken tun etwas anderes (wahrscheinlich beschweren) .
Außerdem sollten Sie auf derselben Datenbank (normalerweise PostgreSQL bei Heroku) entwickeln, testen und bereitstellen. Sie sollten sogar dieselben Versionen des Datenbankservers verwenden. Es gibt andere Unterschiede zwischen Datenbanken (z. B. das Verhalten von GROUP BY), von denen ActiveRecord Sie nicht isoliert. Sie machen das vielleicht schon, aber ich dachte, ich würde es trotzdem erwähnen.
change
eine Typänderung nicht automatisch rückgängig machen zu können, und im Migrationshandbuch heißt es: "[die Änderungsmethode] Diese Methode wird zum Schreiben konstruktiver Migrationen (Hinzufügen von Spalten oder Tabellen) bevorzugt" undchange_column
isn ' t in der Liste, auf die Sie zeigen, also denke ich, dass Sie Recht haben. Ich habe es repariert , umup
/ zu verwendendown
(mit einer Einschränkung auf demdown
), danke für die Heads-Ups.text
nur eine unbegrenzte Länge zu verwenden. Sie können nur uneingeschränkt verwendenvarchar
. Rails legt diese ungerade Grenze fest, nicht PostgreSQL.Obwohl die akzeptierte Antwort ausgezeichnet ist, wollte ich hier eine Antwort hinzufügen, die hoffentlich besser mit der ursprünglichen Posterfrage Teil 2 für Nicht-Experten wie mich umgeht.
Gerüstmigration erzeugen
Sie können eine Migration generieren, um Ihre Änderung zu speichern, indem Sie in Ihre Konsole eingeben (ersetzen
table
Sie einfach den Namen für Ihre Tabellen undcolumn
für Ihren Spaltennamen).Dadurch wird eine Skelettmigration in Ihrer Rails-Anwendung / db / migrate / folder generiert. Diese Migration ist ein Platzhalter für Ihren Migrationscode.
Zum Beispiel möchte ich eine Migration erstellen, um den Typ einer Spalte von
string
nachtext
in einer Tabelle namens TodoItems zu ändern:Führen Sie Ihre Migration aus
Nachdem Sie den Code zum Ändern der Spalte eingegeben haben, führen Sie einfach Folgendes aus:
So wenden Sie Ihre Migration an Wenn Sie einen Fehler machen, können Sie die Änderung jederzeit zurücksetzen mit:
Auf- und Ab-Methoden
Die akzeptierten Antwortreferenzen
Up
undDown
-methoden anstelle der neuerenChange
Methode. Da Rails 3.2 Up- und Down-Methoden im alten Stil einige Vorteile gegenüber der neueren Change-Methode bieten. 'Auf und Ab' vermeidenActiveRecord::IrreversibleMigration exception
. Seit der Veröffentlichung von Rails 4 können Siereversible
diesen Fehler vermeiden:Viel Spaß mit Rails :)
quelle