2012-08-25 15 views
6

Por ejemplo, tengo este modelo:¿Actualizar db/migrar después de actualizar manualmente los modelos?

class Product < ActiveRecord::Base 
    attr_accessible :name, :order 
end 

Luego, cuando lo hice rake db:migrate se creó esta db/migrar/20120825132038_create_products.rb:

class CreateProducts < ActiveRecord::Migration 
    def change 
    create_table :products do |t| 
     t.integer :order 
     t.string :name 

     t.timestamps 
    end 
    end 
end 

Pero todo esto pasó porque yo solía rails generate Product order:integer name:string

Ahora después de ir al modelo del Producto y lo cambio manualmente a:

class Product < ActiveRecord::Base 
    attr_accessible :name, :order, :category_id 

    validates :name, uniqueness: true 
    belongs_to :category 
end 

¿Cómo puedo actualizar automáticamente el db/migrate/20120825132038_create_products.rb con las actualizaciones?

Respuesta

17

Cuando ejecutó rake db:migrate, no creó db/migrate/20120825132038_create_products.rb. Ese archivo de migración se creó cuando ejecutó

rails generate Product order:integer name:string 

attr_accessible no tiene nada que ver con la migración de su base de datos.

recomiendo que lea los carriles de guía en Migrations, así como la sección sobre Mass Assignment que discute attr_accessible.

Para generar un nuevo archivo migración (ya que el mencionado en su pregunta ya ha sido procesado por el rake db:migrate comando anterior que usted ha mencionado en ejecución), ejecute

rails g migration AddCategoryIdToProduct category_id:integer 

Esto debería generar una nueva la migración con contenidos como

class AddCategoryIdToProduct < ActiveRecord::Migration 
    def change 
    add_column :products, :category_id, :integer 
    end 
end 

Correr rake db:migrate de nuevo ahora procesará esta MIG archivo de racionamiento, agregando la nueva columna entera category_id a su tabla products.

+0

Gracias por la excelente explicación! Pero cada vez que quiero agregar un atributo/propiedad (como se llame) a un modelo, necesito usar la migración de carriles g y crear una nueva clase. – Danpe

+0

Si la migración ya se ha aplicado a la base de datos, ** sí **. Un modelo no es más que una interfaz a través de la cual puede interactuar con su base de datos. No manipula la ** estructura ** de su base de datos; para eso son las migraciones. Agregar una columna a una tabla automáticamente hará que los nuevos métodos de atributo estén disponibles dentro del modelo asociado. – deefour

+0

Sí. Siempre cree una nueva migración, incluso para una sola columna. Nunca regrese y edite una migración anterior. Es un buen hábito! Créanme, sus futuros colegas me agradecerán por asegurarse de seguir esta práctica. –

6

Puede volver a realizar una migración mediante la ejecución de

rake db:migrate:up VERSION=20121031143418 #insert the timestamp on migration 

También puede rehacer una migración (corre arriba y abajo, pero sólo funciona si tiene un arriba y abajo, lo que va a no cuando sólo hay un cambio)

rake db:migrate:redo 
Cuestiones relacionadas