Add ActiveRecord::Relation#increment_all and decrement_all #46524
+45
−0
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation / Background
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.
Detail
This pull request adds
increment_all
anddecrement_all
methods, corresponding to the ActiveRecord instanceincrement
anddecrement
. This allows us to write:Player.active.increment_all(:score, 10)
the result of which is immediately clear.