Я создал столбец даты в предыдущей миграции и установил его как обнуляемый. Теперь я хочу изменить его, чтобы он не обнулялся. Как мне поступить так, если в этой базе данных есть пустые строки? Я в порядке с установкой этих столбцов в Time.now, если они в настоящее время нулевые.
ruby-on-rails
migration
Кевин Панг
источник
источник
MyModel.update_all({:date_column => Time.now}, {:date_column => nil})
. Запрос в вашей исходной форме только что заставил все мои модели иметь нулевое значение в поле.change
Метод не так подходит для этого случая , потому что (1)update_all
метод будет выполняться на обоих мигрируют и потенциального Revert. Это может быть не самым худшим, но потому что (2) миграция не может знать, из чего столбец был изменен при потенциальном возврате. Так что для этого случая я бы придерживалсяup
иdown
.В Rails 4 это лучшее (DRYer) решение:
Чтобы гарантировать отсутствие записей со
NULL
значениями в этом столбце, вы можете передать четвертый параметр, который является значением по умолчанию, используемым для записей соNULL
значениями:источник
change_column_null
. Однако приведенный выше комментарий Рика Смита указывает на очень веский случай.Rails 4 (другие ответы по Rails 4 имеют проблемы):
Изменение столбца со значениями NULL в нем, чтобы запретить NULL, вызовет проблемы. Это именно тот код, который будет нормально работать в вашей настройке разработки, а затем падать, когда вы пытаетесь развернуть его в своей рабочей среде LIVE . Сначала вы должны изменить значения NULL на что-то допустимое, а затем запретить значения NULL. 4-е значение в
change_column_null
делает именно это. Смотрите документацию для более подробной информации.Кроме того, я обычно предпочитаю устанавливать значение по умолчанию для поля, поэтому мне не нужно будет указывать значение поля каждый раз, когда я создаю новый объект. Я включил закомментированный код, чтобы сделать это также.
источник
add_column :users, :admin, :string
thenchange_column_null(:admin, :string, false, "new_value_for_existing_records")
Создайте миграцию, в которой есть
change_column
оператор со:default =>
значением.Смотрите: change_column
В зависимости от механизма базы данных вам может понадобиться
change_column_null
источник
change_column_null
.Рельсы 4:
источник
В Rails 4.02+, согласно документации, нет метода, подобного
update_all
2 аргументам. Вместо этого можно использовать этот код:источник
Вы не можете использовать add_timestamps и null: false, если у вас есть существующие записи, поэтому вот решение:
источник