Creé una columna de fecha en una migración anterior y la configuré como anulable. Ahora quiero cambiarlo para que no sea anulable. ¿Cómo hago para hacer esto suponiendo que haya filas nulas en esa base de datos? Estoy de acuerdo con establecer esas columnas en Time.now si actualmente son nulas.
ruby-on-rails
migration
Kevin Pang
fuente
fuente
MyModel.update_all({:date_column => Time.now}, {:date_column => nil})
. La consulta en su forma original acaba de hacer que todos mis modelos tengan un valor nulo en el campo.change
método no es tan adecuado para este caso porque (1) elupdate_all
método se ejecutará tanto en la migración como en una posible reversión. Puede que eso no sea lo peor, pero debido a que (2) la migración no tiene forma de saber de qué se cambió la columna en una posible reversión. Entonces, para este caso, me quedaría conup
ydown
.En Rails 4, esta es una mejor solución (DRYer):
Para asegurarse de que no existan registros con
NULL
valores en esa columna, puede pasar un cuarto parámetro, que es el valor predeterminado para los registros conNULL
valores:fuente
change_column_null
. Sin embargo, el comentario de Rick Smith anterior señala un caso muy válido.Rails 4 (otras respuestas de Rails 4 tienen problemas):
Cambiar una columna con valores NULL para no permitir NULL causará problemas. Este es exactamente el tipo de código que funcionará bien en su configuración de desarrollo y luego se bloqueará cuando intente implementarlo en su producción EN VIVO . Primero debe cambiar los valores NULL a algo válido y luego no permitir NULL. El cuarto valor en
change_column_null
hace exactamente eso. Ver documentación para más detalles.Además, generalmente prefiero establecer un valor predeterminado para el campo, por lo que no necesitaré especificar el valor del campo cada vez que creo un nuevo objeto. Incluí el código comentado para hacer eso también.
fuente
add_column :users, :admin, :string
entonceschange_column_null(:admin, :string, false, "new_value_for_existing_records")
Cree una migración que tenga una
change_column
declaración con un:default =>
valor.Ver: change_column
Dependiendo del motor de la base de datos, es posible que deba usar
change_column_null
fuente
change_column_null
.Carriles 4:
fuente
En Rails 4.02+ según los documentos no hay ningún método como
update_all
con 2 argumentos. En cambio, uno puede usar este código:fuente
No puede usar add_timestamps y null: false si tiene registros existentes, así que aquí está la solución:
fuente