tipo regresar rails modificar modelo migraciones migracion generar dato columna cambiar ruby-on-rails ruby-on-rails-3 migration

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



modificar modelo rails (25)

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?


Abra su consola Ruby on Rails y entre:

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


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 .


Cambios de migración de Rails 5

p.ej:

rieles modelo g Estudiante Student_name: cadena edad: entero

Si quieres cambiar la columna de Student_name como nombre

Nota: - si no ejecuta rails db: migrate

Puedes hacer los siguientes pasos.

rails d model Student student_name: string age: integer

Esto eliminará el archivo de migración generado. Ahora puede corregir el nombre de su columna

rieles modelo g Nombre del estudiante: cadena edad: entero

Si migró (rails db: migrate), siga las opciones para cambiar el nombre de columna

rails g migration RemoveStudentNameFromStudent student_name: string

rails g migration AddNameToStudent name: string


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 rails g migration ChangesNameInUsers (o como quiera que quiera nombrarlo)

Abra el archivo de migración que se acaba de generar y agregue esta línea en el método (entre def change y end ):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

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

¡Revisa tu schema.db para ver si el nombre realmente ha cambiado en la base de datos!

Espero que esto ayude :)


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.


Manualmente podemos utilizar el siguiente método:

Podemos editar la migración manualmente como:

  • Abra la app/db/migrate/xxxxxxxxx_migration_file.rb

  • Actualizar hased_password a hashed_password

  • Ejecuta el siguiente comando

    $> rake db:migrate:down VERSION=xxxxxxxxx

Entonces eliminará tu migración:

$> rake db:migrate:up VERSION=xxxxxxxxx

Agregará su migración con el cambio actualizado.


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 la columna ya está poblada con 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 base de datos para agregar columnas con los nuevos nombres y rellenarlos con los valores del nombre de 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

Entonces cometería ese cambio, y empujaba el cambio a producción.

git commit -m ''adding columns with correct name''

Entonces, una vez que el compromiso ha sido puesto en producción, correría.

Production $ bundle exec rake db:migrate

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

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

Luego 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

Luego, envíe esta última migración a producción y ejecute bundle exec rake db:migrate en segundo plano.

Me doy cuenta de que esto involucra un poco más el proceso, pero prefiero hacer esto antes que tener problemas con mi migración de producción.


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


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

Y puedes escribir otra migración para renombrar la columna.

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

Eso es.


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.


Tienes dos formas de hacer esto:

  1. En este tipo, ejecuta automáticamente el código inverso del mismo, cuando se restaura.

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

  2. Para este tipo, ejecuta el método up cuando rake db:migrate y ejecuta el método down 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



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 #...


Genera el archivo de migración:

rails g migration FixName

# Crea db / migrate / xxxxxxxxxx.rb

Edita la migración para hacer tu voluntad.

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


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


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

Abra ese archivo de migración y modifíquelo de la siguiente manera (ingrese su nombre de table_name original)

class RenameHashedPasswordColumn < ActiveRecord::Migration def change rename_column :table_name, :hased_password, :hashed_password end 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