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
devrait régler les choses. Vous voudrez peut-être :null => false
ou d'autres options à la fin de cela aussi.
Lorsque vous utilisez une string
colonne sans limite explicite, Rails ajoutera un fichier implicite :limit => 255
. 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 une varchar
colonne sans longueur, mais la plupart des bases de données utilisent un type distinct pour cela et Rails ne sait pas varchar
sans longueur. Vous devez utiliser text
dans Rails pour obtenir une text
colonne dans PostgreSQL. Il n'y a pas de différence dans PostgreSQL entre une colonne de type text
et une de type varchar
(mais varchar(n)
c'est différent). De plus, si vous déployez au-dessus de PostgreSQL, il n'y a aucune raison d'utiliser :string
(AKA varchar
) du tout, la base de données traite text
etvarchar(n)
la même chose en interne, sauf pour les contraintes de longueur supplémentaire pour varchar(n)
; vous ne devriez utiliser varchar(n)
(AKA :string
) que si vous avez une contrainte externe (comme un formulaire gouvernemental qui indique que le champ 432 du formulaire 897 / B aura 23 caractères) sur la taille de la colonne.
En passant, si vous utilisez une string
colonne n'importe où, vous devez toujours spécifier le :limit
pour vous rappeler qu'il existe une limite et vous devez 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 lèvera une exception, MySQL tronquera tranquillement 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 (se plaindront probablement) .
De plus, vous devriez également développer, tester et déployer sur la même base de données (qui sera généralement PostgreSQL chez Heroku), vous devriez 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 (comme le comportement de GROUP BY) dont ActiveRecord ne vous isolera pas. Vous le faites peut-être déjà mais j'ai pensé que je le mentionnerais quand même.
change
ne pas pouvoir annuler automatiquement un changement de type et le Guide des migrations dit que "[la méthode de changement] Cette méthode est préférée pour écrire des migrations constructives (ajout de colonnes ou de tables)" etchange_column
n'est pas t dans la liste que vous pointez donc je pense que vous avez raison. Je l'ai corrigé pour utiliserup
/down
(avec une mise en garde sur ledown
), merci pour la tête haute.text
uniquement pour obtenir une longueur illimitée; vous pouvez simplement utiliser sans contraintevarchar
. Rails impose cette limite étrange, pas PostgreSQL.Bien que la réponse acceptée soit excellente, je voulais ajouter ici une réponse qui, espérons-le, mieux traiter la question des affiches originales, partie 2, pour les non-experts comme moi.
génération d'une migration d'échafaudage
Vous pouvez générer une migration pour contenir votre modification en tapant dans votre console (remplacez simplement le
table
pour le nom de vos tables etcolumn
pour votre nom de colonne)Cela générera une migration squelette à l'intérieur de votre dossier application / db / migrate / Rails. Cette migration est un espace réservé pour votre code de migration.
Par exemple, je souhaite créer une migration pour changer le type d'une colonne de
string
àtext
, dans une table appelée TodoItems:Lancer votre migration
Une fois que vous avez entré le code pour changer la colonne, exécutez simplement:
Pour appliquer votre migration. Si vous faites une erreur, vous pouvez toujours annuler la modification avec:
Méthodes haut et bas
Les références
Up
etDown
méthodes de réponse acceptées , au lieu de laChange
méthode la plus récente . Depuis les rails 3.2 de l' ancien style , les méthodes Up and Down présentent quelques avantages par rapport à la nouvelle méthode Change. «Haut et bas» éviterActiveRecord::IrreversibleMigration exception
. Depuis la sortie de Rails 4, vous pouvez utiliserreversible
pour éviter cette erreur:Profitez de Rails :)
la source