Migración de Rails para columna de cambio


Tenemos la sintaxis script/generate migration add_fieldname_to_tablename fieldname:datatype para agregar nuevas columnas a un modelo.

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

Quiero cambiar una columna de datetime a date.

Author: Arslan Ali, 2010-05-10

7 answers

Creo que esto debería funcionar.

change_column :table_name, :column_name, :date
 505
Author: Alex Korban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 05:53:28

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

Ejemplo:

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

Consulte la documentación de la API en la clase de tabla para obtener más detalles.

 95
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-30 08:40:25

No sé si puede crear una migración desde la línea de comandos para hacer todo esto, pero puede crear una nueva migración, luego editar la migración para realizar este taks.

Si tablename es el nombre de la tabla, fieldname es el nombre de su campo y desea cambiar de un datetime fecha, usted puede escribir una migración a hacer esto.

Puede crear una nueva migración con:

rails g migration change_data_type_for_fieldname

Luego edite la migración para usar 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

Luego ejecute el migración:

rake db:migrate
 81
Author: Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-11 20:20:17

Como encontré en las respuestas anteriores, se necesitan tres pasos para cambiar el tipo de columna:

Paso 1:

Genere un nuevo archivo de migración usando este código:

rails g migration sample_name_change_column_type

Paso 2:

Vaya a la carpeta /db/migrate y edite el archivo de migración que realizó. 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 olvides hacer este comando:

rake db:migrate

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

 25
Author: Aboozar Rajabi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-07 05:41:21

Solo genera migración:

rails g migration change_column_to_new_from_table_name

Actualizar 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
 6
Author: Vivek Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-02 16:16:42

Con Raíles 5

Desde Guías de carriles :

Si desea que una migración haga algo que Active Record no sabe cómo revertir, puede usar reversible:

class ChangeTablenameFieldname < ActiveRecord::Migration[5.1]
  def change
    reversible do |dir|
      change_table :tablename do |t|
        dir.up   { t.change :fieldname, :date }
        dir.down { t.change :fieldname, :datetime }
      end
    end
  end
end
 4
Author: Mr. Tao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-10 18:12:16

Otra forma de cambiar el tipo de datos usando migration

Paso 1: Debe eliminar el nombre del campo tipo de datos con errores mediante migration

Ex:

rails g migration RemoveFieldNameFromTableName field_name:data_type

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

Paso 2: Ahora puede agregar campo con el tipo de datos correcto

Ex:

rails g migration AddFieldNameToTableName field_name:data_type

Eso es todo, ahora su tabla se agregará con el campo de tipo de datos correcto, ¡Feliz codificación ruby!!

 1
Author: prasanthrubyist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-10 12:32:45