2011-08-11 16 views
28

Necesito cambiar el valor predeterminado de un campo de 0 a 3, pero el problema es que ya tengo miles de registros y quiero que esos registros cambien el valor a 3 de 0 solo si el registro tiene el valor predeterminado 0 pero para otros valores como 1, 2 debe seguir siendo el mismo. ¿Cómo puedo hacerlo?Migración para cambiar el valor predeterminado de un campo y cambiar todo el valor del registro existente por el nuevo valor predeterminado solo si tiene un valor predeterminado anterior.

+5

¿No puedes simplemente 'ACTUALIZAR la tabla SET valor = 3 DONDE valor = 0'? – Pelshoff

Respuesta

74

En la migración se debe utilizar el método change_column para modificar la configuración de la tabla como esta:

change_column :my_models, :attribute_name, :integer, :default => 3 

Y luego para actualizar todos los registros existentes, en lugar de bucle a través de todos los registros y actualizar de forma individual se puede usar el método update_all desea:

MyModel.update_all({ :attribute_name => 3 }, { :attribute_name => 0 }) 

El primer argumento le dice al método de qué valor establecido y el segundo dice Es la condición para qué filas actualizar.

+0

Agradable y ordenado, no sabía de esto ... –

+0

Me pregunto si esto podría funcionar solo en ciertas bases de datos ya que no estoy seguro de que todo permita cambiar el valor predeterminado. De todos modos, puedo confirmar que funciona en MySQL. – mahemoff

+1

Acabo de probar esto, y creo que la sintaxis podría haber cambiado. Esto funcionó para mí: 'MyModel.update_all ({: attribute_name => 3}, {: attribute_name => 0})' – AlexBrand

2
ALTER TABLE your_table MODIFY your_column tinyint(1) NOT NULL DEFAULT 3; 
UPDATE your_table SET your_column=3 WHERE your_column=0; 
  1. asumiendo que su columna es tinyint(1), reemplazar su auto si no el mismo
  2. NOT NULL es suponiendo que siempre fuerza la columna para que sea NOT NULl
Cuestiones relacionadas