Как изменить столбец допускает значения null, чтобы не nullable в миграционную рельсы?



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

702   7  

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:

def change
  change_column_null(:users, :admin, false )
end

на рельсы 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

    Ничего не найдено.