2012-02-15 6 views
95

В моем приложении Rails (3.2) у меня есть куча таблиц в моей базе данных, но я забыл добавить несколько ненулевых ограничений. Я googled вокруг, но я не могу найти, как написать миграцию, которая добавляет не null в существующий столбец.Ruby on Rails: Как добавить ненулевое ограничение существующего столбца с помощью миграции?

TIA.

ответ

78

Попробуйте change_column:

change_column :table_name, :column_name, :column_type, null: false 
+12

Будьте осторожны с этим подходом - если у вас были другие атрибуты об этом столбце (например, ограничение ': limit'), вам нужно повторить эти атрибуты при использовании' change_column', иначе они будут потеряны. По этой причине я предпочитаю использовать 'change_column_null' –

+0

Обратите внимание, что это генерирует' IrreversibleMigration', который может быть не таким, каким вы хотите. –

+0

@NicNilov вы говорите об ответе или комментарий Натана Уоллеса? – Mark

184

Вы можете также использовать change_column_null:

change_column_null :table_name, :column_name, false 
+5

Самый чистый ответ! –

+1

Мне пришлось изменить его на кучу столбцов, и это не требует указания типа столбца для каждого столбца, намного лучше! – Dorian

+3

Также работает для Rails 4+ – daniel

6

1) ПЕРВЫЙ: Добавить столбец со значением по умолчанию

2), то: Удалить значение по умолчанию

add_column :orders, :items, :integer, null: false, default: 0 
change_column :orders, :items, :integer, default: nil 
+0

Это правильное решение, когда вам нужно добавить новый столбец, который не является нулевым, вам нужно сначала определить, что оно имеет значение по умолчанию, потому что SQLLite будет жаловаться (не может добавить столбец NOT NULL со значением по умолчанию NULL), а затем удалить его! – Mil4n