Sometimes big updates that affect millions of rows kill our database (all queries hang/are blocked).
Therefore we built a simple solution:
class ActiveRecord::Base def self.slow_update_all(set, where, options={}) ids_to_update = find_values(:select => :id, :conditions => where) ids_to_update.each_slice(10_000) do |slice| update_all(set, :id => slice) sleep options[:sleep] if options[:sleep] end ids_to_update.size end end
This needs ActiveRecord find_values extension