¿Cómo se escribe una migración para cambiar el nombre de un modelo de ActiveRecord y su tabla en Rails?

Soy terrible para nombrar y me doy cuenta de que hay un mejor conjunto de nombres para mis modelos en mi aplicación Rails.
¿Hay alguna forma de usar una migración para cambiar el nombre de un modelo y su tabla correspondiente?

Aquí hay un ejemplo:

 class RenameOldTableToNewTable < ActiveRecord::Migration def self.up rename_table :old_table_name, :new_table_name end def self.down rename_table :new_table_name, :old_table_name end end 

Tuve que ir y cambiar el nombre del archivo de statement del modelo de forma manual.

Editar:

En Rails 3.1 y 4, ActiveRecord::Migration::CommandRecorder sabe cómo revertir migraciones de rename_table, por lo que puede hacer esto:

 class RenameOldTableToNewTable < ActiveRecord::Migration def change rename_table :old_table_name, :new_table_name end end 

(Todavía tiene que pasar y renombrar manualmente sus archivos).

En Rails 4, todo lo que tuve que hacer fue cambiar la definición

 def change rename_table :old_table_name, :new_table_name end 

Y todos mis índices fueron atendidos por mí. No necesité actualizar manualmente los índices eliminando los antiguos y agregando otros nuevos.

Y funciona usando el cambio para subir o bajar con respecto a los índices también.

Las otras respuestas y comentarios cubrieron el cambio de nombre de la tabla, el cambio de nombre de archivo y el grepping a través de su código.

Me gustaría agregar algunas advertencias más:

Usemos un ejemplo del mundo real que enfrenté hoy: cambio de nombre de un modelo de ‘Comerciante’ a ‘Negocio’.

  • No olvide cambiar los nombres de tablas y modelos dependientes en la misma migración. Cambié mis modelos MerchantStat y Merchant a Business y BusinessStat al mismo tiempo. De lo contrario, habría tenido que elegir demasiado y elegir al realizar la búsqueda y reemplazo.
  • Para cualquier otro modelo que dependa de su modelo a través de claves externas, los nombres de las columnas de la clave externa de las otras tablas se derivarán del nombre de su modelo original. Así que también querrá hacer algunas llamadas a renombrar columna en estos modelos dependientes. Por ejemplo, tuve que cambiar el nombre de la columna ‘merchant_id’ a ‘business_id’ en varias tablas de unión (para has_and_belongs_to_many relationship) y otras tablas dependientes (para las relaciones normales has_one y has_many). De lo contrario, habría terminado con columnas como ‘business_stat.merchant_id’ apuntando a ‘business.id’. Aquí hay una buena respuesta sobre cómo cambiar los nombres de las columnas.
  • Cuando grepping, recuerde buscar singulares, plurales, mayúsculas, minúsculas e incluso MAYÚSCULAS (lo que puede ocurrir en los comentarios) versiones de sus cadenas.
  • Lo mejor es buscar primero versiones en plural, luego en singular. De esta manera, si tienes un plural irregular, como en mi ejemplo de comerciantes: empresas, puedes corregir todos los plurales irregulares. De lo contrario, puede terminar con, por ejemplo, ‘negocios’ (3 s) como un estado intermedio, lo que da como resultado aún más búsqueda y reemplazo.
  • No reemplace ciegamente cada ocurrencia. Si los nombres de su modelo colisionan con términos de progtwigción comunes, con valores en otros modelos o con contenido de texto en sus vistas, puede terminar demasiado ansioso. En mi ejemplo, quería cambiar el nombre de mi modelo a ‘Negocio’, pero todavía me refería a ellos como ‘comerciantes’ en el contenido de mi UI. También tuve un rol de “comerciante” para mis usuarios en CanCan: fue la confusión entre el rol de comerciante y el modelo de Merchant lo que me llevó a renombrar el modelo en primer lugar.

También necesita reemplazar sus índices:

 class RenameOldTableToNewTable< ActiveRecord:Migration def self.up remove_index :old_table_name, :column_name rename_table :old_table_name, :new_table_name add_index :new_table_name, :column_name end def self.down remove_index :new_table_name, :column_name rename_table :new_table_name, :old_table_name add_index :old_table_name, :column_name end end 

Y cambie el nombre de sus archivos, etc., de forma manual, como lo describen otras respuestas aquí.

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

Asegúrese de poder deshacer y avanzar después de escribir esta migración. Puede ser complicado si obtienes algo incorrecto y te quedas atascado con una migración que intenta afectar algo que ya no existe. Mejor basura toda la base de datos y comenzar de nuevo si no puede retroceder. Así que ten en cuenta que podrías necesitar respaldar algo.

Además, compruebe schema_db para conocer los nombres de columna relevantes en otras tablas definidas por un has_ ​​o belongs_to o algo así. Probablemente necesites editar esos también.

Y, por último, hacer esto sin un conjunto de pruebas de regresión sería una locura.