В миграции рельсов, как вы можете удалить предел поля - PullRequest
47 голосов
/ 14 августа 2010

Правильно ли следующее?

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

Ответы [ 6 ]

95 голосов
/ 07 декабря 2010

Если вы ранее указали ограничение в миграции и хотите просто удалить ограничение, вы можете просто сделать это:

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

255 - это стандартная длина для столбца строки, а рельсы просто вытрутвне предела, который вы указали ранее.

Обновлено:

Хотя это работает во многих версиях Rails, вам, вероятно, будет лучше использовать nil, как в ответе Джузеппе.

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

Это означает, что единственное, что вы делали неправильно, это использование null вместо nil.

34 голосов
/ 29 декабря 2010

Вот что случилось со мной.

Я понял, что моего строкового поля в таблице недостаточно для хранения его содержимого, поэтому я сгенерировал миграцию, которая содержала:

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

Однако после выполнения миграции схема имела:

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

Что было не в порядке .Итак, я «переделал» миграцию следующим образом:

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

На этот раз предел был пройден в schema.rb:

create_table "articles", :force => true do |t|
  t.string   "title"
  t.text     "author_list"
end
3 голосов
/ 07 декабря 2010

Измените тип столбца на :text. У него нет ограничения.

change_column :tablename, :fieldname, :text, :limit => nil
0 голосов
/ 31 марта 2017

Сегодня я был той же лодкой, пытаясь убрать ограничение, которое я добавил в текстовое поле, и это не займет.Пробовал несколько миграций.

Rails 4.2.7.1 Ruby 2.3.1p112

В конце концов, единственное, что сработало, это указание предела 255. Попытка приспособиться к чему-либо другому не сработала бы для меня.

0 голосов
/ 15 августа 2010

Чтобы сделать его независимым от db-драйвера, нужно написать что-то вроде этого:

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 голосов
/ 14 августа 2010

Строки без ограничений - это не то, что поддерживается большинством баз данных: вы должны указать размер в varchar(SIZE) определении.
Хотя вы можете попробовать, я бы лично пошел с :limit => BIG_ENOUGH_NUMBER. Вы также можете рассмотреть возможность использования типа CLOB для очень больших текстов.

...