web-dev-qa-db-fra.com

Dans une migration Rails, comment pouvez-vous supprimer la limite d'un champ

Le texte suivant est-il correct?

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

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

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

255 est la longueur standard d'une colonne de chaîne et Rails effacera simplement la limite que vous avez précédemment spécifiée.

Mis à jour:

Bien que cela 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 vous avez faite de mal a été d'utiliser null au lieu de nil.

93
Jeremy Baker

Voici ce qui m'est arrivé.

J'ai réalisé qu'un champ de chaîne que j'avais dans une table n'était pas suffisant pour contenir son contenu. J'ai donc généré une migration contenant

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 OK . Alors j'ai "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 avait disparu dans schema.rb:

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

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

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

La plupart des bases de données ne prennent pas en charge les chaînes sans limite: vous devez spécifier la taille dans la définition varchar(SIZE).
Bien que vous puissiez essayer, je choisirais personnellement :limit => BIG_ENOUGH_NUMBER. Vous pouvez également envisager d'utiliser le type CLOB pour les très gros textes.

0
Nikita Rybak

Pour le rendre indépendant du pilote de base de données, écrivez 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
0
user420577

J'étais le même bateau aujourd'hui, essayant de supprimer une limite que j'avais ajoutée à un champ de texte et cela ne prendrait pas. Essayé plusieurs migrations. 

Rails 4.2.7.1 Ruby 2.3.1p112

En fin de compte, la seule chose qui a fonctionné a été de spécifier une limite de 255. Essayer de s'adapter à autre chose ne fonctionnerait pas pour moi.

0
GiantCoder