ruby-on-rails - tipo - regresar migracion rails




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

Abra su consola Ruby on Rails y entre:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

hased_password incorrectamente una columna hased_password 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?


Algunas versiones de Ruby on Rails admiten el método de subida / bajada a la migración y, si tiene un método de subida / bajada en su 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 tiene el método de change en su migración, entonces:

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

Para obtener más información, puede mover: Ruby on Rails - Migraciones o Migraciones de registros activos .


Como opción alternativa, si no está casado con la idea de las migraciones, hay una joya convincente para ActiveRecord que manejará los cambios de nombre automáticamente para usted, el estilo Datamapper. Todo lo que debes hacer es cambiar el nombre de la columna en tu modelo (y asegúrate de poner Model.auto_upgrade! En la parte inferior de tu model.rb) y viola! La base de datos se actualiza sobre la marcha.

https://github.com/DAddYE/mini_record

Nota: Tendrá que pulsar Nuke db / schema.rb para evitar conflictos

Todavía en fase beta y, obviamente, no para todos, pero sigue siendo una opción convincente (actualmente lo estoy usando en dos aplicaciones de producción no triviales sin problemas)


Desde la API:

rename_column(table_name, column_name, new_column_name)

Renombra una columna pero mantiene el tipo y el contenido sigue siendo el mismo.


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

rails g migration ChangeHasedPasswordToHashedPassword

Luego, en el archivo generado en la carpeta db/migrate rename_column , escriba rename_column como se muestra a continuación:

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

Estoy en los rieles 5.2 y tratando de cambiar el nombre de una columna en un Usuario de dispositivo.

el bit rename_column funcionó para mí, pero el singular :table_name lanzó un error de "Tabla de usuario no encontrada". Plural trabajó para mí.

rails g RenameAgentinUser

Luego cambia el archivo de migración a esto:

rename_column :users, :agent?, :agent

Donde: agente? es el antiguo nombre de columna.


OMI, en este caso, mejor uso rake db:rollback . Luego edita tu migración y escribe de nuevo rake db:migrate . Sin embargo, si tiene datos en la columna que no quiere perder, use rename_column .


Para Ruby on Rails 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

Si los datos actuales no son importantes para usted, puede eliminar su migración original usando:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

Sin las comillas, realice los cambios en la migración original y vuelva a ejecutar la migración ascendente de la siguiente manera:

rake db:migrate

Si necesita cambiar los nombres de columna, deberá crear un marcador de posición para evitar un error de nombre de columna duplicado . Aquí hay un ejemplo:

class SwitchColumns < ActiveRecord::Migration
  def change
    rename_column :column_name, :x, :holder
    rename_column :column_name, :y, :x
    rename_column :column_name, :holder, :y
  end
end

Simplemente cree una nueva migración y, en un bloque, use rename_column como se muestra a continuación.

rename_column :your_table_name, :hased_password, :hashed_password

Solo genere migración usando el comando

rails g migration rename_hased_password

Después de eso edite la migración agregue la siguiente línea en el método de cambio

rename_column :table, :hased_password, :hashed_password

Esto debería funcionar.



Actualización : un primo cercano de create_table es change_table, que se usa para cambiar las tablas existentes. Se utiliza de forma similar a create_table, pero el objeto cedido al bloque sabe más trucos. Por ejemplo:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

Esta forma es más eficiente si lo hacemos con otros métodos alternativos como: eliminar / agregar índice / eliminar índice / agregar columna, por ejemplo, podemos hacer más como:

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...

Generar una migración de Ruby on Rails :

$:> rails g migration Fixcolumnname

Inserte el código en el archivo de migración (XXXXXfixcolumnname.rb) :

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

 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

rename_column :table, :old_column, :new_column

Actualizar:

Probablemente querrá crear una migración separada para hacer esto. (Cambie el nombre de FixColumnName como quiera)

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, los métodos de up y down todavía se aplican. Rails 3.1 recibe un método de change que "sabe cómo migrar su base de datos y revertirla cuando la migración se revierte sin la necesidad de escribir un método separado".

rails g migration FixColumnName

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

Si resulta que tienes 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
...

Puedes usar change_table para mantener las cosas un poco más change_table .

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 , por traer el tema.

Entonces simplemente db:migrate como de costumbre o de cualquier forma que hagas tu negocio.

Una actualización para Rails 4

Al crear una Migration para cambiar el nombre de una columna, Rails 4 genera un método de change lugar de up y down como se menciona en la respuesta anterior. El método de change generado 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






migration