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