Мне очень нравится миграция в стиле 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
, похоже, игнорируются.Есть другие идеи?