Я создал столбец даты в предыдущем переносе и установил его как nullable. Теперь я хочу изменить его, чтобы он был недействительным. Как мне это сделать, предполагая, что в этой базе данных есть нулевые строки? Я в порядке с настройкой этих столбцов на Time.now, если они в настоящий момент являются нулевыми.
Как изменить столбец с нулевым значением, чтобы он не был нулевым в миграции Rails?
Ответ 1
Если вы сделаете это в процессе миграции, вы можете сделать это следующим образом:
# 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
Ответ 2
В Rails 4 это лучшее решение (DRYer):
change_column_null :my_models, :date_column, false
Чтобы обеспечить отсутствие записей с значениями NULL
в этом столбце, вы можете передать четвертый параметр, который является значением по умолчанию для записей с значениями NULL
:
change_column_null :my_models, :date_column, false, Time.now
Ответ 3
Rails 4 (у других Rails 4 есть проблемы):
def change
change_column_null(:users, :admin, false, <put a default value here> )
# change_column(:users, :admin, :string, :default => "")
end
Изменение столбца с NULL-значениями в нем, чтобы не допускать NULL, вызовет проблемы. Это именно тот тип кода, который будет хорошо работать в вашей настройке разработки, а затем выйдет из строя, когда вы попытаетесь развернуть его в своем режиме LIVE. Вы должны сначала изменить значения NULL на что-то действительное, а затем запретить NULL. Четвертое значение в change_column_null
делает именно это. Подробнее см. .
Кроме того, я обычно предпочитаю устанавливать значение по умолчанию для поля, поэтому мне не нужно указывать значение поля каждый раз, когда я создаю новый объект. Я также включил прокомментированный код, чтобы сделать это.
Ответ 4
Создайте миграцию с оператором change_column
со значением :default =>
.
change_column :my_table, :my_column, :integer, :default => 0, :null => false
Смотрите: change_column
В зависимости от механизма базы данных вам может потребоваться использовать change_column_null
Ответ 5
Рельсы 4:
def change
change_column_null(:users, :admin, false )
end
Ответ 6
В Rails 4.02 + в соответствии с docs нет такого метода, как update_all
с двумя аргументами. Вместо этого можно использовать этот код:
# 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
Ответ 7
Вы не можете использовать 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