Re-saving ActiveRecord Objects Rake Task

Posted by dave
on Thursday, October 29

A quick rake task to allow you to quickly re-save all objects in a model class (maybe you’ve added some new code in an ActiveRecord filter and need to run the code on existing persisted objects).

namespace :db do
  desc "Resave all objects in a model class." 
  task :resave_objects => :environment do
    raise 'USAGE: rake db:resave_objects MODEL=MyModelName' if ENV["MODEL"].nil?
    unsaved = []
    model_class.find(:all).each do |o|
      if o.save
        puts "#{model_class.to_s}(#{o.id}) re-saved\"" 
      else
        unsaved << o
      end
    end
    if unsaved.length > 0
      puts "Some objects failed to save.  Here are their IDs:" 
      unsaved.each do |o|
        puts "#{o.id} : #{o.errors.full_messages}" 
      end
    end
  end
end

def model_class
  if (ENV["MODEL"].split('::').size > 1)
    ENV["MODEL"].split('::').inject(Kernel) {|scope, const_name| scope.const_get(const_name)}
  else
    Object.const_get(ENV["MODEL"])
  end
end