Me gustan mucho las migraciones de estilo de Rails 3, es decir, un método change
lo suficientemente inteligente como para reconocer si las migraciones se están instalando o retrotrayendo, por lo que no tengo que escribir los métodos up
y down
reflejándose entre sí. Pero tengo una situación en la que necesito omitir algún código cuando se retrotrae la migración (actualizando las columnas counter_cache
que estoy agregando).Cómo reconocer la dirección de migración (hacia arriba o hacia abajo) con las migraciones de estilo Rails 3 (def change)?
Miré a http://guides.rubyonrails.org/migrations.html pero los ejemplos al final de la sección de 5 años padecen el mismo problema:
class AddFuzzToProduct < ActiveRecord::Migration
class Product < ActiveRecord::Base
end
def change
add_column :products, :fuzz, :string
Product.reset_column_information
Product.all.each { |f| f.update_attributes! :fuzz => 'fuzzy' }
end
end
Cuando esta migración se revierte, la actualización de fuzz
campo es innecesaria. ¿Hay una forma de prevenirlo?
He intentado buscar en Product.column_names
pero como Rails es lo suficientemente inteligente como para realizar la migración en dirección inversa, la actualización se ejecuta antes de que se elimine la columna. Además, cuando se define el método change
, los métodos up
o down
parecen ignorados. ¿Alguna otra idea?
y Los métodos down no están en desuso para todas las versiones de rieles y son necesarios para cosas como esta. Todas las soluciones aquí provistas son malas porque no son ajenas, y tienen mal olor, y la mejor manera de resolver su problema es simplemente escribir los métodos arriba y abajo correctos – edikgat