Vous devez utiliser text
avec Rails si vous voulez une chaîne sans limite de longueur. Une migration comme celle-ci :
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
faudrait arranger les choses. Vous voudrez peut-être :null => false
ou d'autres options à la fin également.
Lorsque vous utilisez une string
colonne sans limite explicite, Rails ajoutera un :limit => 255
implicite . Mais si vous utilisez text
, vous obtiendrez le type de chaîne de longueur arbitraire pris en charge par la base de données. PostgreSQL vous permet d'utiliser un varchar
colonne sans longueur mais la plupart des bases de données utilisent un type séparé pour cela et Rails ne connaît pas varchar
sans longueur. Vous devez utiliser text
dans Rails pour obtenir un text
colonne dans PostgreSQL. Il n'y a pas de différence dans PostgreSQL entre une colonne de type text
et un de type varchar
(mais varchar(n)
est différent). De plus, si vous déployez sur PostgreSQL, il n'y a aucune raison d'utiliser :string
(AKA varchar
) du tout, la base de données traite text
et varchar(n)
le même en interne à l'exception des contraintes de longueur supplémentaires pour varchar(n)
; vous ne devez utiliser que varchar(n)
(AKA :string
) si vous avez une contrainte externe (comme un formulaire gouvernemental indiquant que le champ 432 du formulaire 897/B comportera 23 caractères) sur la taille de la colonne.
En aparté, si vous utilisez une string
colonne n'importe où, vous devez toujours spécifier le :limit
pour vous rappeler qu'il y a une limite et que vous devriez avoir une validation dans le modèle pour vous assurer que la limite n'est pas dépassée. Si vous dépassez la limite, PostgreSQL se plaindra et déclenchera une exception, MySQL tronquera discrètement la chaîne ou se plaindra (selon la configuration du serveur), SQLite le laissera passer tel quel, et d'autres bases de données feront autre chose (probablement se plaindre) .
En outre, vous devez également développer, tester et déployer sur la même base de données (qui sera généralement PostgreSQL chez Heroku), vous devez même utiliser les mêmes versions du serveur de base de données. Il existe d'autres différences entre les bases de données (telles que le comportement de GROUP BY) dont ActiveRecord ne vous isolera pas. Vous le faites peut-être déjà, mais j'ai pensé que je devais le mentionner quand même.
Mettre à jour :Les nouvelles versions d'ActiveRecord comprennent varchar
sans limite donc, avec PostgreSQL au moins, vous pouvez dire :
change_column :your_table, :your_column, :string, limit: nil
pour changer un varchar(n)
colonne en varchar
. text
et varchar
sont toujours la même chose en ce qui concerne PostgreSQL mais certains constructeurs de formulaires les traiteront différemment :varchar
obtient un <input type="text">
alors que text
obtient un <textarea>
multiligne .