Мне очень нравятся миграции стиля Rails 3, т.е. один метод change
достаточно интеллектуальный, чтобы узнать, установлены ли миграции или откат, поэтому мне не нужно писать up
и down
методы зеркалирования друг друга. Но у меня есть ситуация, когда мне нужно пропустить некоторый код при откат миграции (обновление столбцов counter_cache
, которые я добавляю).
Я посмотрел http://guides.rubyonrails.org/migrations.html, но примеры в конце раздела 5 страдают от одной и той же проблемы:
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
Когда эта миграция отменяется, обновление поля fuzz
не требуется. Есть ли способ предотвратить это?
Я попробовал посмотреть Product.column_names
, но поскольку Rails достаточно умен, чтобы выполнить миграцию в обратном направлении, обновление выполняется до удаления столбца. Кроме того, когда метод change
определен, любые методы up
или down
кажутся проигнорированными. Любые другие идеи?