ruby on rails - Rails: actualizo el archivo de migración y luego ejecuto db: migrate, pero mi esquema no se está actualizando
ruby-on-rails dbmigrate (7)
Estoy tratando de agregar un campo adicional a una de mis tablas.
He añadido el campo en el archivo de migración (en db / migrate), luego ejecuté ''rake db: migrate'' que se ejecutó sin problemas. Mi editor de texto incluso me dijo que mi archivo schema.db ha sido actualizado y necesita actualizarse.
El archivo de esquema no contiene mi nuevo campo y cualquier intento de hacer referencia al campo desde mis puntos de vista falla estrepitosamente.
¿Cómo hago esto? ¿Es posible actualizar una tabla con un campo adicional a través de rieles sin tener que abandonar por completo y volver a crear la base de datos?
Hice lo mismo, quería cambiar el nombre de un campo y en lugar de esto:
class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.string :commenter
t.text :body
# this line adds an integer column called `article_id`.
t.references :article, index: true
t.timestamps
end
end
end
Cambié
t.text :body
a
t.text :comment_body
Traté de hacer rastrillo
db:migrate
no sucedió nada, ya que en el indicador de comando volvía a aparecer sin ningún resultado ..., miré el desbordamiento de pila y this me guió a hacer rake
db:migrate:redo
sin poner
== 20141129044056 CreateComments: reverting ===================================
-- drop_table(:comments)
-> 0.0000s
== 20141129044056 CreateComments: reverted (0.0886s) ==========================
== 20141129044056 CreateComments: migrating ===================================
-- create_table(:comments)
-> 0.0040s
== 20141129044056 CreateComments: migrated (0.0040s) ==========================
y luego cargué mi página / controlador con commenter_body en lugar de body y se cargó perfectamente.
Creo que esto también es una solución para el mismo. No sé si hay algún problema en el funcionamiento debajo del modelo / DB (todavía soy muy nuevo en RoR, en realidad mi tercer día ...)
No sé si esto aplica, pero vale la pena intentarlo. Directamente de " Desarrollo ágil con rieles, 3ª edición ":
A veces, esta tabla schema_migrations puede causarle problemas. Por ejemplo, si crea el archivo fuente de migración y ejecuta db:migrate
antes de agregar cualquier declaración de definición de esquema al archivo, la base de datos pensará que se ha actualizado, y la tabla de información del esquema contendrá el nuevo número de versión.
Si luego edita ese archivo de migración existente y ejecuta db:migrate
nuevamente, Rails no sabrá cómo aplicar sus nuevos cambios. En estas circunstancias, a menudo es más fácil eliminar la base de datos, volver a crearla y volver a ejecutar las migraciones.
Pude regenerar mi esquema con las últimas migraciones ejecutando rake db:schema:dump
Resuelto mi propia pregunta ..
Básicamente, en lugar de editar los archivos de migración originales generados cuando ejecuta andamios, crea un nuevo archivo de migración solo para lo que quiere lograr:
http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration
Siempre debe crear un nuevo archivo de migración al agregar / cambiar algo en la base de datos. Este es el propósito de las migraciones. Un archivo de migración debe tener la capacidad de realizar el nuevo cambio y deshacer el cambio. De esta manera, si algo sale mal o cambia de opinión, puede volver fácilmente a una migración anterior.
Las siguientes secciones de enlaces etiquetadas como "Anatomía de una migración" y "Cómo escribir una migración" pueden ser de ayuda.
Una vez que hagas rake db: migrate entonces otra vez u no puedes agregar una columna a ese archivo. Tienes que generar un nuevo archivo de migración usando rails g migration add_columnname_to_tablename para agregar esa columna en particular y hacer rake db: migrate. ¡Eso es todo!
http://guides.rubyonrails.org/migrations.html#changing-existing-migrations
Ocasionalmente cometerás un error al escribir una migración. Si ya ha ejecutado la migración, no puede simplemente editar la migración y ejecutar la migración nuevamente: Rails cree que ya ha ejecutado la migración y, por lo tanto, no hará nada cuando ejecute rake db: migrate. Debe revertir la migración (por ejemplo, con
rake db:rollback
), editar su migración y luego ejecutarrake db:migrate
para ejecutar la versión corregida.