将counter_caches汇总在一起

时间:2013-12-20 22:18:01

标签: ruby-on-rails activerecord

所以......我有3个模特。

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

所以,我想要一个我的Foo专栏,其行为类似于bars_count,除了我想将bazs_count Bar加在一起,而不是.size }。我是否必须使用before_save或其他内容进行手动操作? Rails中是否已存在具有此功能的内容?

所以,如果有2个柱子...... 1个有bazs_count = 4,另一个有bazs_count = 8。如果这两个条都属于foo,那么每当bars_count = 12更改时我都希望bazs_count

理由是......我经常会检查特定foo有多少个bazs,我想让查询保持最小化。

1 个答案:

答案 0 :(得分:1)

您可以将以下方法添加到Baz模型中,以递增和递减Foo模型中的bazs_count列。我发现Rails将baz复数化为bazs而不是bazes。

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