namespace :db do
desc 'Squash migrations' task :squash_migrations => 'db:migrate' do migration_proxies = ActiveRecord::Migrator.migrations(ActiveRecord::Migrator.migrations_path) last_migration_proxy = migration_proxies.last migration_proxies = migration_proxies.take(migration_proxies.size - 1) migration_proxies.each do |migration_proxy| remove_migration_file(migration_proxy.filename) end FileUtils.cp('db/schema.rb', last_migration_proxy.filename) file_array = File.readlines(last_migration_proxy.filename) index = file_array.find_index { |item| item.match('ActiveRecord::Schema.define') } file_array.shift(index + 1) file_array.insert(0, "class #{last_migration_proxy.name} < ActiveRecord::Migration", ' def up') file_array << '' << ' def down' << " puts '>>> Do not rollback first migration!'" << ' raise' << ' end' << 'end' File.open(last_migration_proxy.filename, 'w') do |f| file_array.each { |line| f.puts(line) } end if git_repo? `git add db/schema.rb` `git add #{last_migration_proxy.filename}` end end def remove_migration_file(filename) if git_repo? `git rm #{filename}` else File.delete(filename) end end def git_repo? system('git status') end
end