Правильно ли это?
change_column :tablename, :fieldname, :limit => null
Правильно ли это?
change_column :tablename, :fieldname, :limit => null
Если вы ранее указали ограничение в переносе и хотите просто удалить предел, вы можете просто сделать это:
change_column :users, :column, :string, :limit => 255
255 - стандартная длина столбца строки, а рельсы просто уничтожают предел, который вы ранее указали.
Обновлено:
В то время как это работает во многих версиях Rails, вы, вероятно, лучше подходят для использования nil
, как в ответе Джузеппе.
change_column :users, :column, :string, :limit => nil
Это означает, что единственное, что вы делали неправильно, - это использовать null
вместо nil
.
Вот что со мной произошло.
Я понял, что строковое поле, которое у меня было в таблице, недостаточно для хранения его содержимого, поэтому я создал миграцию, содержащую:
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
Измените тип столбца на :text
. Он не имеет предела.
change_column :tablename, :fieldname, :text, :limit => nil
Строки без ограничений - это не то, что большинство баз данных поддерживает: вы должны указать размер в определении varchar(SIZE)
.
Хотя вы могли бы попробовать, я бы лично пошел с :limit => BIG_ENOUGH_NUMBER
. Вы можете также использовать тип CLOB для очень больших текстов.
Чтобы сделать его независимым от 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
Сегодня я был одним и тем же лодком, пытаясь удалить лимит, добавленный в текстовое поле, и это не займет. Пробовал несколько миграций.
Rails 4.2.7.1 Ruby 2.3.1p112
В конце концов, единственное, что сработало, это указание предела 255. Попытка приспособиться ко всему остальному не сработала бы для меня.