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

StackOverflow https://stackoverflow.com/questions/1992019

Pregunta

Me llamó erróneamente un hased_password columna en lugar de hashed_password.

¿Cómo puedo actualizar el esquema de base de datos, mediante la migración a cambiar el nombre de esta columna?

¿Fue útil?

Solución

rename_column :table, :old_column, :new_column

Actualización:

Usted probablemente querrá para crear una migración independiente para hacer esto. (Cambiar nombre FixColumnName como se quiere)

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

A continuación, edite 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

se siguen aplicando métodos

Mientras que, el up y down. Carriles de 3.1 recibe un método que change "sabe cómo migrar su base de datos y marcha atrás cuando la migración se deshace sin el necesidad de escribir un método por separado "

rails g migration FixColumnName

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

Si le sucede que 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
...

Se podría utilizar change_table para mantener las cosas un poco más ordenado.

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 a colación el tema.

A continuación, sólo db:migrate como de costumbre o como usted va sobre su negocio.


Una actualización para los carriles 4

Durante la creación de un Migration como para cambiar el nombre de una columna, los carriles 4 genera un método change en lugar de up y down como se menciona en la respuesta anterior. El método change generado es como a continuación:

$ > rails g migration ChangeColumnName

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

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

Otros consejos

OMI, en este caso, un mejor uso rake db:rollback. A continuación, edite la migración y de nuevo tipo rake db:migrate. Sin embargo, si tiene datos de la columna que no quieren perder, a continuación, utilizar rename_column.

Si la columna ya se rellena con datos y en directo en la producción, lo recomiendo un enfoque paso a paso, con el fin de evitar el tiempo de inactividad en la producción a la espera de las migraciones.

En primer lugar me gustaría crear una migración db añadir columnas con el nuevo nombre (s) y rellenar con los valores del antiguo nombre de la columna.

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

A continuación, me gustaría cometer simplemente que el cambio, y empujar el cambio en la producción.

git commit -m 'adding columns with correct name'

A continuación, una vez que el commit ha sido empujado en la producción, había corrido.

Production $ bundle exec rake db:migrate

A continuación, me gustaría actualizar todos los puntos de vista / controladores que hace referencia el nombre de columna antiguo al nuevo nombre de la columna. Ejecutar a través de mi banco de pruebas, y comprometerse a solo esos cambios. (Después de asegurarse de que estaba trabajando a nivel local y pasar todas las pruebas de primera!)

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

Entonces me empujo de que se comprometan a la producción.

En este punto se puede quitar la columna original sin tener que preocuparse acerca de cualquier tipo de tiempo de inactividad asociado a la migración en sí misma.

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, empujar esta última migración a la producción y ejecución bundle exec rake db:migrate en el fondo.

Me di cuenta que es un poco más complicado de un proceso, pero prefiero hacer esto que tienen problemas con mi migración producción.

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

Bajo Available Transformations

rename_column(table_name, column_name, new_column_name):

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

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

rails g migration ChangeHasedPasswordToHashedPassword

A continuación, en el archivo generado en la carpeta db/migrate, rename_column escribir de la siguiente manera:

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

A partir de la API:

rename_column(table_name, column_name, new_column_name)

Se cambia el nombre de una columna pero mantiene el tipo y el contenido sigue siendo igual.

Algunas versiones de Ruby on Rails apoyo a arriba / abajo método para la migración y si tiene arriba / abajo método en su migración, a continuación:

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 usted tiene el método change en su migración, a continuación:

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

Para obtener más información se puede mover: Ruby on Rails - Las migraciones o Active Record migraciones .

Si el código no se comparte con otro, entonces la mejor opción es hacer precisamente rake db:rollback y modifique el nombre de la columna en la migración y rake db:migrate. Eso es todo

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

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

Eso es todo.

Si es necesario cambiar los nombres de columna que necesitará para crear un marcador de posición para evitar una duplicado de error nombre de la columna . He aquí 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

Como opción alternativa, si no está casado con la idea de las migraciones, hay una joya de peso para ActiveRecord que manejará el nombre cambia automáticamente para usted, DataMapper estilo. Todo lo que hacemos es cambiar el nombre de la columna en el modelo (y asegúrese de poner Model.auto_upgrade! en la parte inferior de su model.rb) y la viola! La base de datos se actualiza en tiempo real.

https://github.com/DAddYE/mini_record

Nota: Usted tendrá que bombardear db / schema.rb para evitar conflictos

Aún en fases beta y, obviamente, no para todos, pero sigue siendo una opción atractiva (actualmente lo estoy usando en dos aplicaciones de producción no triviales, sin problemas)

Si los datos actuales no es importante para usted, usted puede simplemente hacer caer el original usando la migración:

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

Sin las comillas, a continuación, hacer cambios en la migración original y ejecutar la migración de nuevo por:

rake db:migrate

Simplemente crear una nueva migración, y en un bloque, el uso rename_column como a continuación.

rename_column :your_table_name, :hased_password, :hashed_password

Para rubí en los carriles 4:

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

manualmente podemos utilizar el siguiente método:

Podemos editar manualmente la migración como:

  • app/db/migrate/xxxxxxxxx_migration_file.rb Abrir

  • Actualizar hased_password a hashed_password

  • Ejecutar el siguiente comando

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

A continuación, se eliminará la migración:

$> rake db:migrate:up VERSION=xxxxxxxxx

Se añade la migración con el cambio actualizado.

Generar el archivo de migración:

rails g migration FixName

# Crea db / migrate / xxxxxxxxxx.rb

Editar la migración para hacer tu voluntad.

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

Ejecutar rails g migration ChangesNameInUsers (o lo que sea que le gustaría darle un nombre)

Abrir el archivo de migración que acaba de ser generado, y añadir esta línea en el método (en el medio def change y end):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

Guardar el archivo y ejecute rake db:migrate en la consola

Confirmar su schema.db con el fin de ver si el nombre ha cambiado realmente en la base de datos!

Espero que esto ayude:)

$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

Abrir el archivo de migración y modificar el archivo de la siguiente manera (Do introduzca su table_name originales)

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end
 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

Generar un rubí en los carriles de migración

$:> rails g migration Fixcolumnname

Insertar 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

Abra el rubí en los carriles de la consola y escriba:

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

Hay dos maneras de hacer esto:

  1. En este tipo se ejecuta automáticamente el código inverso de la misma, cuando rollback.

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. Para este tipo, se ejecuta el método cuando rake db:migrate y ejecuta el método de abajo cuando rake db:rollback:

    def self.up
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    def self.down
      rename_column :table_name,:new_column_name,:old_column_name
    end
    

Estoy en los carriles 5,2, y tratando de cambiar el nombre de una columna en un legado del usuario.

el bit rename_column trabajó para mí, pero el :table_name singular lanzó una "tabla de usuario no encontrado" de error. Plural trabajó para mí.

rails g RenameAgentinUser

A continuación, archivo de migración cambio a esto:

rename_column :users, :agent?, :agent

Donde: agente? es el antiguo nombre de la columna.

Sólo generar la migración con el comando

rails g migration rename_hased_password

Después de que la migración de edición complemento siguiente línea en el método de cambio

rename_column :table, :hased_password, :hashed_password

Esto debería hacer el truco.

Carriles 5 migración cambios

por ejemplo:

  

carriles student_name g modelo Student: edad cadena: entero

Si desea cambiar student_name columna como nombre

Nota: - Si no ejecuta carriles db: migrate

Se puede hacer siguiendo los pasos

  

carriles d student_name modelo de estudiante: edad cadena: entero

Este archivo de migración eliminará generado, Ahora se puede corregir el nombre de la columna

  

carriles g modelo Nombre del estudiante: edad cadena: entero

Si ha migrado (carriles db: migrate), a raíz de opciones a cambio de nombre de la columna

  

carriles g migración RemoveStudentNameFromStudent student_name: cadena

     

raíles g migración AddNameToStudent nombre: cadena

Actualizar - Un primo cercano del create_table es change_table, que se utiliza para cambiar las tablas existentes. Se utiliza de una manera 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

De esta manera es más eficiente si hacemos con otros métodos alter como: remove / index add / index remove / columna complemento, por ejemplo, podemos hacer aún 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
#...
scroll top