Say you want to update a numeric column on a subset of records. update_all is fine:
Player.active.update_all("score = score + 10")
But using update_all with user input is very unsafe:
Player.active.update_all("score = score + #{params[:extra]}")
A safe way to do it is to use update_counters:
Player.active.update_counters(score: params[:extra])
But the naming of that method is a bit weird. We’re not updating these columns, we’re incrementing them. Also, these columns don’t need to be counters, they can be any number column.
I propose we add increment_all and decrement_all methods, as counterparts to the ActiveRecord instance increment and decrement. Then we could use:
Player.active.increment_all(:score, 10)
which is immediately clear.