counter_cache won't increment

Eleo wrote:

I'm having an odd problem. I've pinpointed what's causing it, but it's not making any sense.

class Discussion < ActiveRecord::Base   has_many :posts, :dependent => :destroy

  def bump     update_attribute(:bumped_on, Time.now)   end end

class Post < ActiveRecord::Base   belongs_to :discussion, :counter_cache => true

  after_create :bump_discussion

  def bump_discussion     discussion.bump   end end

Now I can do something obvious like post = Post.new post.discussion = Discussion.find(:first) post.save

But this won't increment posts_count in the discussions table. HOWEVER, if I remove the bump_discussion method then posts_count DOES get updated. This doesn't really make any sense. My guess is that updating the row one way is overriding the other update.

Currently counter_cache fields are not excluded from being updated when a save is done, so the updated count, written directly to the DB, is getting overwritten by the old count in the Discussion object.

The most simple solution is to rewrite bump as

def bump    update_all "bumped_on = #{self.class.sanitize(Time.now)}", "id = #{id}" end