namespace :db do
namespace :rollback do
rule "" do |t|
back = t.name.gsub("db:rollback:", '').to_s
back = "1" if back == "db:rollback"
ENV['back'] = back
Rake::Task["db:rollback:default"].invoke
end
desc "Rollback the database schema"
task :default => :environment do
schema = ActiveRecord::Migrator.current_version.to_i
if ENV.include?("back") && ENV['back'].to_i <= schema
rollback = schema - ENV['back'].to_i
else
rollback = schema - 1
end
ActiveRecord::Migrator.migrate("db/migrate/", rollback)
puts "schema rolled back to verison #{rollback} from #{schema}"
end
end
end
Now you can do stuff like:
rake db:rollback:4
This will rollback the database 4 versions back. What if you want to move it forward though? Just pass a negative integer like so:
rake db:rollback:-3