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

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

+169
11 мая '11 в 15:34
источник поделиться
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
+184
11 мая '11 в 15:49
источник

В Rails 4 это лучшее решение (DRYer):

change_column_null :my_models, :date_column, false

Чтобы обеспечить отсутствие записей с значениями NULL в этом столбце, вы можете передать четвертый параметр, который является значением по умолчанию для записей с значениями NULL:

change_column_null :my_models, :date_column, false, Time.now
+139
10 апр. '14 в 17:19
источник

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 делает именно это. Подробнее см. .

Кроме того, я обычно предпочитаю устанавливать значение по умолчанию для поля, поэтому мне не нужно указывать значение поля каждый раз, когда я создаю новый объект. Я также включил прокомментированный код, чтобы сделать это.

+62
08 авг. '14 в 20:26
источник

Создайте миграцию с оператором change_column со значением :default =>.

change_column :my_table, :my_column, :integer, :default => 0, :null => false

Смотрите: change_column

В зависимости от механизма базы данных вам может потребоваться использовать change_column_null

+31
11 мая '11 в 15:42
источник

Рельсы 4:

def change
  change_column_null(:users, :admin, false )
end
+11
07 мая '14 в 17:58
источник

В 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
+3
30 янв. '15 в 9:55
источник

Вы не можете использовать 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
+1
16 февр. '17 в 16:27
источник

Посмотрите другие вопросы по меткам или Задайте вопрос