Formal way to reset counters

Has there ever been discussion of adding a method to recalculate counter cache values?

This seems like it would be useful both for adding counter caches to existing tables, and also for fixing things up when direct SQL manipulations are used (performance reasons in my case).

There are actually two parts to the problem. The simple part is that the update_counters only supports incremental change, so doing a full reset would require some awkward arithmetic.

The more complex part is using the association reflections to calculate the actual value automatically. Doing so would require the participation of both the belongs_to reflection *and* the has_many reflection, which I can see being a bit smelly given the fact that the counter cache currently works without the need for has_many to be declared at all. However I think it's utility might outweigh the complexity...

What do you guys think?

+1 for a public API

I’ve been using this :frowning: http://gist.github.com/247472

https://rails.lighthouseapp.com/projects/8994/tickets/1211

Mike

Brilliant find Mike, good work hardbap, and thanks for applying Jeremy, but I don't actually like this API because it doesn't let you update a single row. If you have lots of rows this will be unacceptably slow, as in slower than the amount of time it would take to manually write and execute an SQL query to do the reset.

I'm going to reopen with an additional patch with how I think it should be done.

Please do!

Thanks, jeremy

It's up. Doesn't look like I can change the ticket status though.

https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1211-reset_counter_cache#ticket-1211-16

pardon the whitespace noise in the ticket

also FYI, I ran tests against mysql,sqlite and postgres and had 1 mysql failure and 2 postgres failures independent of this.