Подтвердить что ты не робот

В миграции рельсов, как вы можете удалить предел поля

Правильно ли это?

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

Ответ 1

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

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

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

Обновлено:

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

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

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

Ответ 2

Вот что со мной произошло.

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

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 "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

Измените тип столбца на :text. Он не имеет предела.

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Rails 4.2.7.1 Ruby 2.3.1p112

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