2012-04-28 6 views
70

Parece que la nueva versión de rieles tiene métodos de "cambio" en comparación con los métodos self.up y self.down.Migraciones de rieles: autoalmacenamiento y autodescarga versus cambio

Entonces, ¿qué sucede cuando uno tiene que retrotraer una migración? ¿Cómo sabe qué acciones realizar? Tengo el siguiente método que necesito para poner en práctica sobre la base de un tutorial en línea:

class AddImageToUsers < ActiveRecord::Migration 
    def self.up 
    add_column :users, :image_file_name, :string 
    add_column :users, :image_content_type, :string 
    add_column :users, :image_file_size, :integer 
    add_column :users, :image_updated_at, :datetime 
    end 

    def self.down 
    remove_column :users, :image_file_name, :string 
    remove_column :users, :image_content_type, :string 
    remove_column :users, :image_file_size, :integer 
    remove_column :users, :image_updated_at, :datetime 
    end  
end 

¿Cómo puedo hacer lo mismo con el nuevo método de cambio?

+2

http://guides.rubyonrails.org/migrations.html#using-the-change-method – Baldrick

Respuesta

96

Para muchas operaciones raíles puede adivinar cuál es la operación inversa (sin problemas). Por ejemplo, en su caso, ¿cuál es la operación inversa de add_column para llamar cuando revierte? Por supuesto es remove_column. ¿Cuál es el inverso de create_table? Es drop_table. Entonces, en estos casos, los rieles saben cómo deshacer y definir un método down que es superfluo (puede ver en la documentación el methods currently supported from the change method).

Sin embargo, prestar atención porque de algún tipo de operación que todavía tiene que definir el método de down, por ejemplo, si cambia la precisión de una columna decimal cómo adivinar la precisión original en rollback? No es posible, por lo que debe definir el método down.

Como he dicho, le sugiero que lea el Rails Migrations Guide.

1
class AddImageToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :image_file_name, :string 
    add_column :users, :image_content_type, :string 
    add_column :users, :image_file_size, :integer 
    add_column :users, :image_updated_at, :datetime 
    end 
end 
+0

Gracias. Pero, ¿qué pasaría si tuvieras que retroceder? ¿Sabría qué hacer? – banditKing

+3

Me quedé dormido. Aldo 'xoen' Giambelluca explica todo. –

22

mejor usar Arriba, Abajo, Cambio:

En Los Carriles 3 (reversible): que debe añadir nueva columna en un máximo y llenar todos los registros de tabla sólo en un máximo, y sólo eliminar esta columna abajo

def up 
    add_column :users, :location, :string 
    User.update_all(location: 'Minsk') 
end 

def down 
    remove_column :users, :location 
end 

Pero:

había que evitar el uso de método de cambio que permite ahorrar algo de tiempo. Por ejemplo, si usted no necesita actualizar valor de la columna inmediatamente después de que la adición se cortaría el código abajo a como este:

def change 
    add_column :users, :location, :string 
end 

En el para arriba que se sumará a la columna de mesa y quitarla hacia abajo. Mucho menos código y es una ganancia.

En Los Carriles 4: una forma más útil escribir lo que necesitamos en un solo lugar:

def change 
    add_column :users, :location, :string 
    reversible do |direction| 
    direction.up { User.update_all(location: 'Minsk') } 
    end 
end 
+0

Explicación agradable bro –

+0

revirtiendo? también es una buena forma de indicar la dirección en la que va dentro del cambio – baash05

+0

Nada de esto funciona. Sigo recibiendo 'ActiveRecord :: IrreversibleMigration'. –

Cuestiones relacionadas