2010-05-10 10 views
284

Tenemos script/generate migration add_fieldname_to_tablename fieldname:datatype sintaxis para agregar nuevas columnas a un modelo.rieles de migración para la columna de cambio

En la misma línea, tenemos un script/generate para cambiar el tipo de datos de una columna? ¿O debería escribir SQL directamente en mi migración vainilla?

Quiero cambiar una columna de datetime a date.

Respuesta

478

Creo que esto debería funcionar.

change_column :table_name, :column_name, :date 
+0

que estaba esperando más de un script/generate ruta de migración. change_column funciona bien en una migración independiente – papdel

+13

@b_ayan: hasta donde yo sé, las únicas palabras mágicas en los nombres de migración son "agregar" y "eliminar". –

+0

Tipo de carriles noob aquí, pero ... Entiendo la respuesta, pero no los comentarios sobre esta respuesta. Se agradecieron las aclaraciones :) –

93

También puede utilizar un bloque si tiene varias columnas para cambiar de una tabla.

Ejemplo:

change_table :table_name do |t| 
    t.change :column_name, :column_type, {options} 
end 

Véase el API documentation on the Table class para más detalles.

80

No estoy al tanto si se puede crear una migración desde la línea de comandos para hacer todo esto, pero se puede crear una nueva migración, a continuación, editar la migración Para realizar esta prueba TAKS.

Si nombretabla es el nombre de la tabla, nombre de campo es el nombre de su campo y que desea cambiar de una fecha y hora hasta la fecha, puede escribir una migración de hacer esto.

Puede crear una nueva migración con:

rails g migration change_data_type_for_fieldname 

A continuación, edite la migración a utilizar change_table:

class ChangeDataTypeForFieldname < ActiveRecord::Migration 
    def self.up 
    change_table :tablename do |t| 
     t.change :fieldname, :date 
    end 
    end 
    def self.down 
    change_table :tablename do |t| 
     t.change :fieldname, :datetime 
    end 
    end 
end 

A continuación, ejecute la migración:

rake db:migrate 
23

Como ya he encontrado por las respuestas anteriores, se necesitan tres pasos para cambiar el tipo de una columna:

Paso 1:

generar un nuevo archivo de migración utilizando este código:

rails g migration sample_name_change_column_type 

Paso 2:

Ir a /db/migrate carpeta y editar el archivo de migración que ha realizado. Hay dos soluciones diferentes.

  1. def change 
        change_column(:table_name, :column_name, :new_type) 
    end 
    

2.

def up 
     change_column :table_name, :column_name, :new_type 
    end 

    def down 
     change_column :table_name, :column_name, :old_type 
    end 

Paso 3:

No se olvide de hacer este comando:

rake db:migrate 

que han probado esta solución para Rails 4 y funciona bien.

+1

En el paso 2, el primero fallará después de ejecutar rake db: rollback, le recomendamos que compruebe el segundo – Feuda

+0

¿Hay una convención de rieles que permite que todo se haga más o menos al generar el archivo de migración sin tener que ir a él y editarlo? ¿eso? – BKSpurgeon

+0

@BKSpurgeon Sí, consulte la documentación aquí: http://edgeguides.rubyonrails.org/active_record_migrations.html –

0

Otra forma de cambiar el tipo de datos a través de la migración

Paso 1: Es necesario eliminar el nombre del campo de tipo de datos en fallo mediante la migración

ejemplo:

rails g migration RemoveFieldNameFromTableName field_name:data_type 

Aquí no olvide especificar el tipo de datos para su campo

Paso 2: ya se puede añadir campo con el tipo de datos correcto

ejemplo:

rails g migration AddFieldNameToTableName field_name:data_type 

Eso es todo, ahora será añadido a su tabla con el campo de tipo de datos correcto, feliz rubí de codificación !!

1

sólo generan la migración:

rails g migration change_column_to_new_from_table_name 

actualización de la migración de esta manera:

class ClassName < ActiveRecord::Migration 
    change_table :table_name do |t| 
     t.change :column_name, :data_type 
    end 
end 

y finalmente

rake db:migrate 
Cuestiones relacionadas