Parece que la nueva versión de rieles tiene métodos de "cambio" versus self.up y self.down.
Entonces, ¿qué sucede cuando uno tiene que revertir una migración? ¿Cómo sabe qué acciones realizar? Tengo el siguiente método que necesito implementar basado en 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?
ruby-on-rails
migration
rey bandido
fuente
fuente
Respuestas:
Para muchas operaciones, los rieles pueden 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
llamar cuando retrocede ? Por supuesto que lo esremove_column
. ¿Qué es el inverso decreate_table
? Esdrop_table
. Entonces, en estos casos, los rieles saben cómo retroceder y definir undown
método es superfluo (puede ver en la documentación los métodos actualmente compatibles con el método de cambio ).Pero preste atención porque para algún tipo de operación aún necesita definir el
down
método , por ejemplo, si cambia la precisión de una columna decimal, ¿cómo adivinar la precisión original en la reversión? No es posible, por lo que debe definir eldown
método.Como se dijo, le sugiero que lea la Guía de migración de Rails .
fuente
Es mejor usar Arriba, Abajo, Cambiar:
On Rails 3 (Reversible): que debe agregar una nueva columna hacia arriba y completar todos los registros en la tabla solo hacia arriba, y solo eliminar esta columna hacia abajo
def up add_column :users, :location, :string User.update_all(location: 'Minsk') end def down remove_column :users, :location end
Pero:
Debía evitar usar el método de cambio, lo que permite ahorrar algo de tiempo. Por ejemplo, si no necesita actualizar el valor de la columna inmediatamente después de agregarlo, debe cortar este código para así:
def change add_column :users, :location, :string end
En la parte superior, agregará una columna a la tabla y la eliminará en la parte inferior. Mucho menos código y es una ganancia.
On Rails 4: una forma más útil de 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
fuente
ActiveRecord::IrreversibleMigration
.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
fuente