Ruby on rails 将计数器缓存相加

Ruby on rails 将计数器缓存相加,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,所以。。。我有三种型号 class Foo < ActiveRecord::Base has_many :bars end class Bar < ActiveRecord::Base belongs_to :foo has_many :bazs end class Baz < ActiveRecord::Base belongs_to :bar, counter_cache: true end class Foo

所以。。。我有三种型号

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo
  has_many :bazs
end

class Baz < ActiveRecord::Base
  belongs_to :bar, counter_cache: true
end
class Foo
因此,我想为我的Foo创建一个行为类似于
Bar\u count
的列,除了我想将
Bar
bazz\u count
添加在一起,而不是
.size
。我必须在这里手动,在保存之前使用
?Rails中已经有这种功能了吗

所以,如果有两个酒吧。。。1具有
bazz_计数=4
,另一个具有
bazz_计数=8
。如果这两个条都属于一个foo,我希望在
bazz\u计数
发生变化时使用
bars\u count=12


原因是。。。我经常会检查一个特定的foo有多少个Baz,我希望将查询保持在最小值。

您可以向Baz模型添加以下方法,以增加和减少foo模型中的
Baz\u count
列。我发现Rails使baz到baz多元化,而不是baz多元化

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo, counter_cache: true
  has_many :bazs
end

class Baz < ActiveRecord::Base
  belongs_to :bar, counter_cache: true

  after_create :increment_foo_counter
  after_destroy :decrement_foo_counter

  private

  def increment_foo_counter
    Foo.increment_counter(:bazs_count, bar.foo_id)
  end

  def decrement_foo_counter
    Foo.decrement_counter(:bazs_count, bar.foo_id)
  end
end
class Foo
不,没有,你必须自己手动完成。好的。。。因此,当
计数器\u缓存
更新条形图时,它实际上没有保存,因此不会触发我的
保存后调用条形图。如果之后我
Bar.find(1).save
,那么它会正确更新Foo。怎么触发的?搞定了。我尝试了一些其他的时髦方法,重写了counter_cache方法。这正是我想要的,非常感谢!看到
.increment\u counter
方法在运行,以及如何像那样调用它,这很酷。。。如果我愿意,如果我不打算调用Baz上的
计数器缓存,我实际上可以将其删除。很不错的。