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
ahashed_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:
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
Para este tipo, ejecuta el método up cuando
rake db:migrate
y ejecuta el método down cuandorake 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
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Bajo Available Transformations
rename_column(table_name, column_name, new_column_name):
Renombra una columna pero mantiene el tipo y el contenido.
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