开发者

In a rails migration, how can you remove the limit of a field

开发者 https://www.devze.com 2023-01-11 19:40 出处:网络
Is the following correct? 开发者_Go百科 change_column :tablename, :fieldname, :limit => null If you previously specified a limit in a migration and want to just remove the limit, you can just do t

Is the following correct?

开发者_Go百科
 change_column :tablename, :fieldname, :limit => null


If you previously specified a limit in a migration and want to just remove the limit, you can just do this:

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

255 is the standard length for a string column, and rails will just wipe out the limit that you previously specified.

Updated:

While this works in a number of Rails versions, you would probably be better suited to use nil like in Giuseppe's answer.

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

That means the only thing you were doing wrong was using null instead of nil.


Here's what happened to me.

I realized that a string field I had in a table was not sufficient to hold its content, so I generated a migration that contained:

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

After running the migration, however, the schema had:

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

Which was not OK. So then I "redid" the migration as follows:

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

This time, the limit was gone in schema.rb:

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


Change the column type to :text. It does not have a limit.

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


Strings without limit is not something most databases support: you have to specify size in varchar(SIZE) definition.
Although you could try, I would personally go with :limit => BIG_ENOUGH_NUMBER. You may also consider using CLOB type for very big texts.


To make it db-driver-independent one should write smth like this:

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


I was the same boat today, trying to remove a limit I'd added to a text field and it wouldn't take. Tried several migrations.

Rails 4.2.7.1 Ruby 2.3.1p112

In the end, the only thing that worked was specifying a limit of 255. Trying to adjust to anything else wouldn't work for me.

0

精彩评论

暂无评论...
验证码 换一张
取 消