Le texte suivant est-il correct?
change_column :tablename, :fieldname, :limit => null
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
.
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
Changez le type de colonne en :text
. Il n'y a pas de limite.
change_column :tablename, :fieldname, :text, :limit => nil
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.
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
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.