Как изменить столбец с нулевым значением, чтобы он не был нулевым в миграции Rails?

Я создал столбец даты в предыдущем переносе и установил его как nullable. Теперь я хочу изменить его, чтобы он был недействительным. Как мне это сделать, предполагая, что в этой базе данных есть нулевые строки? Я в порядке с настройкой этих столбцов на Time.now, если они в настоящий момент являются нулевыми.

Ответ 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

Ответ 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