93 votes

Modification d'un type de colonne en chaînes plus longues dans les rails

Lors de la première migration, j'ai déclaré sur une colonne content à chaîne Activerecord fait qu'il soit string(255) selon annoter gem.

Après je pousse à l'application de heroku, qui utilise postgres, si j'entre dans la forme que dans le contenu d'une chaîne de plus de 255 je reçois le message d'erreur

PGError: ERROR: value too long for type character varying(255)

Le problème est que j'ai besoin que le contenu de contenir une chaîne de caractères qui est extrêmement long, peut-être (texte libre, peut être des milliers de caractères)

  1. Ce variable est une chaîne n'est pas approprié pour cette) serait pg accepter?
  2. Comment puis-je créer une migration de remplacer le type de la colonne

merci

225voto

mu is too short Points 205090

Vous devez utiliser text avec des Rails si vous voulez une chaîne sans limite de longueur. Une migration comme ceci:

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 arranger les choses. Vous souhaitez peut - :null => false ou quelques autres options sur la fin de ce trop.

Lorsque vous utilisez un string colonne sans une limite explicite, les Rails ajouter un implicite :limit => 255. Mais si vous utilisez text, vous allez obtenir ce que la longueur arbitraire de type chaîne de la base de données prend en charge. PostgreSQL permet d'utiliser un varchar colonne sans longueur, mais la plupart des bases de données utilisent un type distinct pour que les Rails et ne savent pas à propos de varchar sans longueur. Vous devez utiliser text dans les 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 une autre de type varchar (mais varchar(n) est différent). En outre, si vous déployez sur le dessus de PostgreSQL, il n'y a pas de raison d'utiliser :string (AKA varchar), la base de données gère text et varchar(n) de même en interne, sauf pour la longueur supplémentaire de contraintes pour l' varchar(n); vous ne devez utiliser varchar(n) (AKA :string) si vous avez une contrainte externe (comme une forme de gouvernement qui dit que le terrain de 432 sur le formulaire 897/B sera de 23 caractères) sur la taille de la colonne.

En aparté, si vous utilisez un string colonne n'importe où, vous devez toujours spécifier l' :limit comme un rappel pour vous-même qu'il ya une limite et vous devriez avoir une validation dans le modèle afin que la limite n'est pas dépassée. Si vous dépassez la limite, PostgreSQL va se plaindre et lever une exception, MySQL va tranquillement tronquer la chaîne ou de se plaindre (en fonction de la configuration du serveur), SQLite va la laisser passer, et d'autres bases de données ne sont autre chose (probablement se plaindre).

En outre, vous devez également être en développement, le test et le déploiement sur le dessus de la même base de données (qui sera généralement PostgreSQL à Heroku), vous devriez utiliser les mêmes versions de la base de données du serveur. Il existe d'autres différences entre les bases de données (tels que le comportement de GROUPE) qui ActiveRecord de ne pas vous isoler. Vous avez peut-être déjà, mais j'ai pensé que je le mentionne quand même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X