ruby-on-rails-3 - migraciones - migracion en rails
¿Cuál es la mejor manera de colocar una mesa y quitar un modelo en Rails 3? (2)
Tengo un modelo y una tabla que ya no necesito en mi aplicación, podría dejarlos allí, pero me gustaría eliminarlos para mantener las cosas ordenadas.
Estoy tratando de descubrir la mejor manera de eliminarlos sin mis archivos migrations & db / schema.rb y cualquier efecto secundario que pueda tener en mi entorno de producción, mi aplicación está en Heroku. Estoy usando PostgreSQL tanto en mi máquina local como en heroku.
Hasta ahora, he encontrado dos formas de hacerlo, pero no estoy seguro de cuál es el mejor método / vía de acceso.
Método 1
Pensé en ir a mi base de datos, dejar caer la mesa y luego destruir el modelo.
rails db
DROP TABLE table_name
/q
rails destroy model model_name
Si hago esto, ¿qué pasará con las migraciones que tengo para este modelo / tabla? Tengo dos migraciones para este modelo, un timestamp_create_modelname y un add_attribute_to_table name.
¿Este método también actualizará el archivo db / schema.rb ?
Cuando presiono la aplicación para Heroku, sospecho que se eliminará el modelo, pero la tabla permanecerá en su lugar, ¿hay un comando heroku para colocar una tabla?
Método dos
Otra forma de leer es generar una nueva migración para soltar la tabla y luego destruir el modelo.
rails generate migration drop_tablename
y luego actualiza el siguiente archivo:
db / migrate / timestamp_drop_tablename (actualizado en respuesta a la respuesta de Dan Wich a continuación)
class DropTablename < ActiveRecord::Migration
def up
drop_table :tablename
end
def down
create_table :tablename do |t|
t.string :table_column
t.references :anothertable
t.timestamps
end
add_index :tablenames, :anothertable_id
end
end
y luego en la terminal:
rake db:migrate
rails destroy model model_name
rake db:migrate
git add .
git commit -m "removed table/model_name"
git push heroku master
heroku run rake db:migrate
heroku restart
Este parece ser el mejor método, pero ¿qué ocurre con los archivos de migración anteriores? ¿Permanecerán y actualizarán db / shema cada vez que ejecute rake db: migrar solo para ser reemplazado por db / migrate / timestamp_drop_tablename?
Me complace experimentar con el segundo método, pero me gustaría que alguien con alguien con experiencia lo comparta y me diga las formas de hacerlo.
El segundo método es la forma ideal de manejar esto: sus archivos de migración están destinados a representar cómo su base de datos ha cambiado con el tiempo. Los archivos de migración anteriores permanecerán en su proyecto (en el caso, hipotéticamente, usted quería volver a una versión anterior), pero Rails no los ejecutará cuando rake db:migrate
porque sabe que ya se han ejecutado (basado en datos en la tabla schema_migrations de la base de datos).
Su schema.rb se actualizará una vez para reflejar que su base de datos ya no contiene esa tabla.
Un pequeño ajuste a su código: su archivo de migración debería soltar la tabla en el método up
, e idealmente recrearlo en el método down
. El "arriba" significa que su migración deja caer la tabla para avanzar en el tiempo, y si la migración se retrotrae, se ejecutará el método de down
.
Sé que es un viejo tema. La mayoría de las veces, desea eliminar no solo el modelo, sino también las rutas, el controlador y las vistas asociadas con ese modelo. Para hacer eso, ejecuta estos
rails g migration DropYourModel
rails destroy scaffold YourModelName
Edite su archivo de migración a drop_table
y luego ejecútelo
rake db:migrate
Si el modelo se define en un espacio de nombres, por ejemplo, admins
, reemplace el primer comando con
rails destroy scaffold admins/YourModelName