48 votes

Dans une migration rails, comment supprimer la limite d'un champ ?

Le texte suivant est-il correct ?

 change_column :tablename, :fieldname, :limit => null

98voto

Jeremy Baker Points 891

Si vous avez précédemment spécifié une limite dans une migration et que vous voulez simplement supprimer cette limite, vous pouvez le faire :

change_column :users, :column, :string, :limit => 255

255 est la longueur standard d'une colonne de chaînes de caractères, et les rails effacent simplement la limite que vous avez spécifiée précédemment.

Mis à jour :

Bien que cette méthode fonctionne dans un certain nombre de versions de Rails, il serait probablement plus approprié d'utiliser nil comme dans la réponse de Giuseppe.

change_column :users, :column, :string, :limit => nil

Cela signifie que la seule chose que tu faisais mal était d'utiliser null au lieu de nil .

34voto

Giuseppe Points 1264

Voici ce qui m'est arrivé.

Je me suis rendu compte qu'un champ de type chaîne de caractères que j'avais dans une table n'était pas suffisant pour contenir son contenu, j'ai donc généré une migration qui contenait :

def self.up
  change_column :articles, :author_list, :text
end

Après avoir exécuté la migration, cependant, le schéma avait :

create_table "articles", :force => true do |t|
  t.string   "title"
  t.text     "author_list", :limit => 255
end

Ce qui n'était pas bon . J'ai donc "refait" la migration comme suit :

def self.up
  # careful, it's "nil", not "null"
  change_column :articles, :author_list, :text, :limit => nil
end

Cette fois, la limite a disparu dans schema.rb :

create_table "articles", :force => true do |t|
  t.string   "title"
  t.text     "author_list"
end

3voto

edgerunner Points 9581

Changez le type de colonne en :text . Il n'y a pas de limite.

change_column :tablename, :fieldname, :text, :limit => nil

0voto

Nikita Rybak Points 36641

Les chaînes de caractères sans limite ne sont pas prises en charge par la plupart des bases de données : vous devez spécifier la taille dans les champs suivants varchar(SIZE) définition.
Bien que vous puissiez essayer, j'opterais personnellement pour :limit => BIG_ENOUGH_NUMBER . Vous pouvez également envisager d'utiliser le type CLOB pour les textes très volumineux.

0voto

user420577 Points 1

Pour le rendre indépendant du pilote de base de données, il faut écrire quelque chose comme ceci :

add_column :tablename, :fieldname_tmp, :text
Tablename.reset_column_information
Tablename.update_all("fieldname_tmp = fieldname")
remove_column :tablename, :fieldname
rename_column :tablename, :fieldname_tmp, :fieldname

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