Criei uma coluna de data em uma migração anterior e a defini como anulável. Agora eu quero alterá-lo para não ser anulável. Como eu faço isso assumindo que existem linhas nulas nesse banco de dados? Eu estou bem em definir essas colunas como Time.now se elas estiverem atualmente nulas.
ruby-on-rails
migration
Kevin Pang
fonte
fonte
MyModel.update_all({:date_column => Time.now}, {:date_column => nil})
. A consulta em sua forma original apenas fez com que todos os meus modelos tenham valor nulo no campo.change
método não é tão adequado para este caso porque (1) oupdate_all
método será executado na migração e em uma reversão em potencial. Isso pode não ser a pior coisa, mas porque (2) a migração não tem como saber do que a coluna foi alterada em uma possível reversão. Portanto, neste caso, eu ficaria comup
edown
.No Rails 4, esta é uma solução melhor (DRYer):
Para garantir que não existam registros com
NULL
valores nessa coluna, você pode passar um quarto parâmetro, que é o valor padrão a ser usado para registros comNULL
valores:fonte
change_column_null
. No entanto, o comentário de Rick Smith acima indica um caso muito válido.Rails 4 (outras respostas do Rails 4 têm problemas):
Alterar uma coluna com valores NULL para não permitir NULL causará problemas. Esse é exatamente o tipo de código que funcionará bem na sua configuração de desenvolvimento e falhará quando você tentar implantá-lo na sua produção do LIVE . Você deve primeiro alterar valores NULL para algo válido e, em seguida, desabilitar NULLs. O quarto valor em
change_column_null
faz exatamente isso. Veja a documentação para mais detalhes.Além disso, geralmente prefiro definir um valor padrão para o campo, portanto não precisarei especificar o valor do campo toda vez que criar um novo objeto. Incluí o código comentado para fazer isso também.
fonte
add_column :users, :admin, :string
thenchange_column_null(:admin, :string, false, "new_value_for_existing_records")
Crie uma migração que tenha uma
change_column
instrução com um:default =>
valor.Veja: change_column
Dependendo do mecanismo do banco de dados, você pode precisar usar
change_column_null
fonte
change_column_null
.Trilhos 4:
fonte
No Rails 4.02+, de acordo com os documentos, não há método como
update_all
com 2 argumentos. Em vez disso, pode-se usar este código:fonte
Você não pode usar add_timestamps e null: false se você tiver registros existentes, então aqui está a solução:
fonte