2010-08-21 16 views
23

¿Es posible cambiar un campo que es una cadena a un número entero sin borrar los datos ya ingresados?Rails ¿Migración para convertir cadena a entero?

La estructura db actual de la tabla en cuestión es:

create_table :people do |t| 
t.string :company_id 

es esto posible utilizando las migraciones?

Estoy pensando que quizás en la migración deje caer el campo anterior, cree uno nuevo que sea un número entero, pero me preocupa que esto borre todos los datos ya ingresados.

Gracias,

Danny

Respuesta

28

No deje caer la columna, se borrará los datos.

Sin embargo, puede intentar

change_column :people, :company_id, :integer 

y si todos los valores en company_id se pueden convertir en integer, que debe estar bien.

Si ese no es el caso (es decir, no todas las cadenas se pueden convertir por defecto), puede hacerlo en dos pasos: 1) crear una nueva columna, luego cargar company_id allí después de alguna conversión. 2) suelte company_id y cambie el nombre de la nueva columna.

Debe tener cuidado con ambos métodos (más aún para el segundo) y probablemente debería hacerlo primero en una copia de la base de datos, si puede.

+0

gracias por mejorar el formato, jigfox – Zaki

+0

Grande, Gracias. Supongo que no tengo que indicar el tipo actual en el primer ejemplo. – dannymcc

+2

El primer enfoque generó errores para mí cuando presioné el código para Heroku. PG :: DatatypeMismatch: ERROR: la columna "company_id" no se puede convertir automáticamente al tipo entero CONSEJO: Especifique una expresión USING para realizar la conversión. : ALTER TABLE "colaboradores" ALTER COLUMN "company_id" TIPO entero ¡rake abortado! StandardError: Se ha producido un error; esta y todas las migraciones posteriores se cancelaron: PG :: DatatypeMismatch: ERROR: la columna "company_id" no se puede convertir automáticamente al tipo entero CONSEJO: especifique una expresión USING para realizar la conversión. – Evolve

31

No deje caer la columna, utilice este

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

La "pista" que obtuvo de PostgreSQL básicamente le dice que usted necesita para confirmar que desea que esto suceda, y cómo se deben convertir los datos. Para confirmar los cambios, utilice el bloque anterior en su migración

+0

Esta debería ser la respuesta aceptada – BananaNeil

8

Las otras respuestas son correctas, sin embargo, se puede dar un paso más allá con la :using palabra clave:

change_column :people, :company_id, :integer, using: 'company_id::integer'