Ruby on rails RubyonRails关联-删除不符合';不存在于协会中

Ruby on rails RubyonRails关联-删除不符合';不存在于协会中,ruby-on-rails,callback,associations,counter,Ruby On Rails,Callback,Associations,Counter,所以我有一个foo模型,它有很多酒吧 foo.bar提供了与foo相关的所有条。每次删除一个条,我都会通过:after\u remove回调调用Foo.decrement\u计数器(:bar\u count,self[:id]) 我正在测试移除一个与foo无关的酒吧。这也会使计数器递减。。。这是我不想要的。如何确保计数器仅在从关联中实际删除某个条时递减 has_and_belongs_to_many :bar, :after_remove => :dec_bar_count, :after

所以我有一个foo模型,它有很多酒吧

foo.bar提供了与foo相关的所有条。每次删除一个条,我都会通过:after\u remove回调调用Foo.decrement\u计数器(:bar\u count,self[:id])

我正在测试移除一个与foo无关的酒吧。这也会使计数器递减。。。这是我不想要的。如何确保计数器仅在从关联中实际删除某个条时递减

has_and_belongs_to_many :bar, :after_remove => :dec_bar_count, :after_add => :inc_bar_count, :uniq => true

def dec_bar_count(record)
  Foo.decrement_counter(:bar_count, self[:id])
end

谢谢。

为什么不用
Foo.bar.count

也许我误解了您正在计数的内容,但似乎您正在尝试复制ActiveRecord中已有的计数功能


也可能与Rails中的DB缓存有关。

在删除
回调后,您是否可以发布用于
回调的完整代码?我已经用代码更新了问题。我想将计数存储在DB中,这样我就不必每次检索计数时都计算Foo.bar.count,因为我预计协会的规模会越来越大。此外,使用Foo.bar.count不是并发友好的,因为它首先选择count(*),然后更新计数器列。Rails将为您缓存DB work,因此不会每次都重新计算它。它缓存计数的答案,如果添加/删除记录(在任何线程中),它将被标记为“脏”,只重新计算一次,然后再次缓存,直到更改为止。换句话说,Rails设计者想到了这一点,ActiveRecord自动完成了这一点。