2010-02-16 7 views
9

¿Es posible cambiar el nombre de una columna usando un comando como:cambiar el nombre de una columna en rieles

script/generate migration AddColumnToTable column:type 

? Gracias.

+2

posible duplicado de [¿Cómo cambiar el nombre de una columna de base de datos en los raíles mediante la migración?] (Http://stackoverflow.com/questions/1992019/how-to-rename-a -database-column-in-rails-using-migration) – CharlesB

Respuesta

17

Rails tiene un comando de migración en ActiveRecord ConnectionAdapter llamado rename_column. Puede generar una migración y luego escribir el código usted mismo. Ejemplo (MySQL):

script/generate migration rename_my_column_by_hand 

luego editar el archivo se crea:

class RenameMyColumnByHand < ActiveRecord::Migration 
    def self.up 
    rename_column :my_table, :old_name, :new_name 
    end 

    def self.down 
    rename_column :my_table, :new_name, :old_name 
    end 
end 

Ejecuta SQL como:

ALTER TABLE my_table CHANGE old_name new_name BIGINT; 

Nota Esto sólo cambia el nombre de la columna, que ganó' t cambie el nombre de cualquier referencia que tenga en otras tablas.

+0

Gracias Scott, muy usefu – Victor

+0

wow esto realmente funciona, también con sqlite. Siempre tengo este problema, ya que me gusta usar nombres de columnas que están reservados en rieles, y hasta ahora usé enfoques mucho más complicados. – Zane

2

Una gran pregunta. La respuesta es, desafortunadamente, no. Ver Rails 2.3.5 código fuente:

lib/rails_generator/generators/components/migration/migration_generator.rb 

Las únicas palabras clave que son reconocidos por el generador de la migración son add, remove y to/from.

1

Uso un poco de engaño aquí. Digamos que quiero cambiar la columna foo a la barra.

Crear una migración con los siguientes pasos

  • Añadir un temp_foo columna temporal
  • actualización de todos los registros, ahorrando el valor de foo en temp_foo
  • Añadir una barra de columna
  • actualización de todos los registros, el ahorro de temp_foo valor en la barra
  • Columna de caída foo
  • Columna de caída temp_foo

Esto es ex-tre-me-ly frágil. Si un paso falla, es posible que pierda datos ..

Cuestiones relacionadas