Sie sollten text
verwenden mit Rails, wenn Sie eine Zeichenfolge ohne Längenbegrenzung wünschen. 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 Sache regeln. Vielleicht möchten Sie :null => false
oder einige andere Optionen am Ende davon.
Wenn Sie eine string
verwenden Spalte ohne explizites Limit, fügt Rails ein implizites :limit => 255
hinzu . Aber wenn Sie text
verwenden , erhalten Sie jeden Zeichenfolgentyp mit beliebiger Länge, den die Datenbank unterstützt. PostgreSQL ermöglicht die Verwendung eines varchar
Spalte ohne Länge, aber die meisten Datenbanken verwenden dafür einen separaten Typ und Rails kennt varchar
nicht ohne Länge. Sie müssen text
verwenden in Rails, um einen text
zu erhalten Spalte in PostgreSQL. In PostgreSQL gibt es keinen Unterschied zwischen einer Spalte vom Typ text
und eine vom Typ varchar
(aber varchar(n)
ist anders). Wenn Sie darüber hinaus PostgreSQL bereitstellen, gibt es keinen Grund, :string
zu verwenden (AKA varchar
) behandelt die Datenbank text
und varchar(n)
intern dasselbe, mit Ausnahme der zusätzlichen Längenbeschränkungen für varchar(n)
; Sie sollten nur varchar(n)
verwenden (AKA :string
), wenn Sie eine externe Einschränkung (z. B. ein Regierungsformular, das besagt, dass Feld 432 auf Formular 897/B 23 Zeichen lang sein wird) für die Spaltengröße haben.
Nebenbei, wenn Sie einen string
verwenden Spalte überall, sollten Sie immer :limit
angeben als Erinnerung daran, dass es eine Grenze gibt und Sie eine Validierung im Modell haben sollten, um sicherzustellen, dass die Grenze nicht überschritten wird. Wenn Sie das Limit überschreiten, beschwert sich PostgreSQL und löst eine Ausnahme aus, MySQL schneidet die Zeichenfolge stillschweigend ab oder beschwert sich (abhängig von der Serverkonfiguration), SQLite lässt sie so passieren, wie sie ist, und andere Datenbanken werden etwas anderes tun (wahrscheinlich beschweren). .
Außerdem sollten Sie auch auf derselben Datenbank entwickeln, testen und bereitstellen (was bei Heroku normalerweise PostgreSQL sein wird), Sie sollten sogar dieselben Versionen des Datenbankservers verwenden. Es gibt andere Unterschiede zwischen Datenbanken (wie das Verhalten von GROUP BY), vor denen ActiveRecord Sie nicht isoliert. Vielleicht machst du das schon, aber ich dachte, ich erwähne es trotzdem.
Aktualisieren :Neuere Versionen von ActiveRecord verstehen varchar
ohne Limit also, zumindest mit PostgreSQL, kann man sagen:
change_column :your_table, :your_column, :string, limit: nil
um ein varchar(n)
zu ändern Spalte zu varchar
. text
und varchar
sind für PostgreSQL immer noch dasselbe, aber einige Formularersteller behandeln sie anders:varchar
erhält einen <input type="text">
wohingegen text
erhält einen mehrzeiligen <textarea>
.