increment_counter
increment_counter(counter_name, id)Increment a number field by one, usually representing a count.
This is used for caching aggregate values, so that they don’t need to be computed every time. For example, a DiscussionBoard may cache post_count and comment_count otherwise every time the board is shown it would have to run an SQL query to find how many posts and comments there are.
Options
counter_name The name of the field that should be incremented id The id of the object that should be incremented
Examples
# Increment the post_count column for the record with an id of 5 DiscussionBoard.increment_counter(:post_count, 5)
3Notes
See also: ActiveRecord::Base#increment
This is a class-level method. For the instance-level equivalent see: ActiveRecord::Base#increment
item = Item.find(1)
item.foo_count # => 0
Item.increment_counter(:foo_count, 1)
item.foo_count # => 0
item.reload
item.foo_count # => 1
item.increment(:foo_count)
item.foo_count # => 2
won't refresh updated_at
This will not cause :updated_at column to refresh, while ActiveRecord::Base#increment! would.
The "instance-level equivalent" ActiveRecord::Base#increment is NOT atomic
Typically, you want to increment counters atomically, so the class method ActiveRecord::Base.increment_counter is the right choice.
Also, there is an issue with the increment example below as it does not save automatically:
item = Item.find(1)
item.foo_count # => 0
item.increment(:foo_count)
item.foo_count # => 1
item.reload
item.foo_count # => 0
item.increment(:foo_count)
item.save
item.reload
item.foo_count # => 1