Как изменить столбец допускает значения null, чтобы не nullable в миграционную рельсы?
Я создал столбец даты в предыдущей миграции и установил его как nullable. Теперь я хочу изменить его, чтобы он не был обнулен. Как я могу это сделать, предполагая, что в этой базе данных есть нулевые строки? Я в порядке с установкой этих столбцов на время.теперь, если они в настоящее время null.
7 ответов:
Если вы делаете это в миграции, тогда вы могли бы сделать это так:
# Make sure no null value exist MyModel.where(date_column: nil).update_all(date_column: Time.now) # Change the column to not allow null change_column :my_models, :date_column, :datetime, null: false
в рельсах 4, это лучшее решение (сухое):
change_column_null :my_models, :date_column, falseчтобы гарантировать, что никакие записи не существуют с
nullзначения в этом столбце:MyModel.update_all({ date_column: Time.now }, { date_column: nil })
рельсы 4 (другие рельсы 4 ответы имеют проблемы):
def change change_column_null(:users, :admin, false, <put a default value here> ) # change_column(:users, :admin, :string, :default => "") endизменение столбца с нулевыми значениями в нем, чтобы не разрешить NULL вызовет проблемы. Это именно тот тип кода, который будет отлично работать в вашей настройке разработки, а затем сбой при попытке развернуть его в LIVE производства. Сначала вы должны изменить значения NULL на что-то действительное и затем запретить нулями. 4-е значение
change_column_nullделает именно это. Видеть документация для более подробной информации.
создать миграцию, которая имеет
change_columnзаявление:default =>значение.
change_column :my_table, :my_column, :integer, :default => 0, :null => falseпосмотреть: change_column
в зависимости от компонента database engine может потребоваться использовать
change_column_null
на рельсы 4.02+ по словам docs нет такого метода, как
update_allС 2 аргументами. Вместо этого можно использовать этот код:# Make sure no null value exist MyModel.where(date_column: nil).update_all(date_column: Time.now) # Change the column to not allow null change_column :my_models, :date_column, :datetime, null: false
вы не можете использовать add_timestamps и null: false, если у вас есть существующие записи, так что вот решение:
def change add_timestamps(:buttons, null: true) Button.find_each { |b| b.update(created_at: Time.zone.now, updated_at: Time.zone.now) } change_column_null(:buttons, :created_at, false) change_column_null(:buttons, :updated_at, false) end
Comments