method

increment_counter

increment_counter(counter_name, id)
public

Increments the specified counter by one. So DiscussionBoard.increment_counter("post_count", discussion_board_id) would increment the "post_count" counter on the board responding to discussion_board_id. This is used for caching aggregate values, so that they don’t need to be computed every time. Especially important for looping over a collection where each element require a number of aggregate values. Like the DiscussionBoard that needs to list both the number of posts and comments.

3Notes

See also: ActiveRecord::Base#increment

tadman · Sep 30, 20092 thanks

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

lulalala · Mar 5, 2012

This will not cause :updated_at column to refresh, while ActiveRecord::Base#increment! would.

The "instance-level equivalent" ActiveRecord::Base#increment is NOT atomic

gerry3 · Nov 5, 2013

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