Pregunta ¿Cómo puedo cambiar el nombre de una columna de base de datos en una migración de Ruby on Rails?


Yo nombré erróneamente una columna hased_password en lugar de hashed_password.

¿Cómo actualizo el esquema de la base de datos, usando la migración para cambiar el nombre de esta columna?


1280
2018-01-02 16:18


origen


Respuestas:


rename_column :table, :old_column, :new_column

Actualizar:

Es probable que desee crear una migración por separado para hacer esto. (Cambie el nombre de FixColumnName como lo hará)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

Luego edita la migración para hacer tu voluntad.

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

Una actualización para Rails 3.1

Mientras que la up y down métodos aún se aplican Rails 3.1 recibe un change método que "sabe cómo migrar su base de datos y revertirla cuando se retrotrae la migración sin la necesidad de escribir un método alternativo por separado"

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Si tiene un montón de columnas para cambiar el nombre, o algo que habría requerido repetir el nombre de la tabla una y otra vez.

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

Podrías usar change_table para mantener las cosas un poco más ordenadas.

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

Gracias, Luke && Turadg, para sacar el tema.

Entonces solo db:migrate como de costumbre o como sea que haga su negocio.


Una actualización para Rails 4

Al crear un Migration en cuanto al cambio de nombre de una columna, Rails 4 genera un change método en lugar de up y down como se menciona en la respuesta anterior. El generado change método es el siguiente:

$ > rails g migration ChangeColumnName

que creará un archivo de migración similar a este:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

2081
2018-01-02 16:31



OMI, en este caso, mejor uso rake db:rollback. Luego edite su migración y nuevamente escriba rake db:migrate. Sin embargo, si tiene datos en la columna que no desea perder, utilice rename_column.


65
2018-01-03 00:55



http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Debajo Available Transformations

rename_column(table_name, column_name, new_column_name):

Cambia el nombre de una columna, pero conserva el tipo y el contenido.


26
2018-01-02 16:26



Si la columna ya está llena de datos y está en producción, recomendaría un enfoque paso a paso para evitar el tiempo de inactividad en la producción mientras se esperan las migraciones.

Primero crearía una migración de db para agregar columnas con el nuevo nombre (s) y llenarlas con los valores del nombre de la columna anterior.

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

Luego, me comprometo con ese cambio e introduzco el cambio en la producción.

git commit -m 'adding columns with correct name'

Luego, una vez que la confirmación se haya puesto en producción, correría.

Production $ bundle exec rake db:migrate

Luego actualizaba todas las vistas / controladores que hacían referencia al nombre de la columna anterior al nombre de la nueva columna. Ejecutar a través de mi suite de pruebas, y cometer solo esos cambios. (¡Después de asegurarse de que estaba funcionando localmente y aprobar todas las pruebas primero!)

git commit -m 'using correct column name instead of old stinky bad column name'

Entonces empujaría ese compromiso a la producción.

En este punto, puede eliminar la columna original sin preocuparse por ningún tipo de tiempo de inactividad asociado con la migración en sí.

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

A continuación, envíe esta última migración a producción y ejecución bundle exec rake db:migrate en el fondo.

Me doy cuenta de que esto es un poco más complicado en un proceso, pero preferiría hacer esto que tener problemas con mi migración de producción.


24
2017-08-30 22:08



Ejecute el siguiente comando para crear un archivo de migración:

rails g migration ChangeHasedPasswordToHashedPassword

Luego en el archivo generado en el db/migrate carpeta, escribir rename_column como a continuación:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

16
2017-12-03 11:45



De API:

rename_column(table_name, column_name, new_column_name)

Cambia el nombre de una columna pero mantiene el tipo y el contenido igual.


13
2018-02-18 11:15



Algunas versiones de Ruby on Rails admiten el método up / down para la migración y si tiene un método up / down en la migración, entonces:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

Si tienes el change método en su migración, entonces:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

Para más información puedes moverte: Ruby on Rails - Migraciones o Migraciones de registros activos.


12
2018-02-14 10:38



Si su código no se comparte con otro, entonces la mejor opción es hacer solo rake db:rollback luego edite su nombre de columna en la migración y rake db:migrate. Eso es

Y puede escribir otra migración para cambiar el nombre de la columna

 def change
    rename_column :table_name, :old_name, :new_name
  end

Eso es.


10
2017-12-04 14:34