嵌套模型的计数总和

嵌套模型的计数总和

问题描述:

我有两个模型:类别广告类别has_many:广告 +我加了计数器缓存:ads_count。我使用gem awesome_nested_set制作嵌套类别,因此Category1可以是Category2的父/子,可以是Category3的父类等。我需要的是我的类别#索引是计算属于某个类别或子类别的广告的总数类别(或“孙子”等)。我现在的解决方案是:some_nested_categories.sum(:ads_count)。但是让我们说,如果我的索引页中有许多类别,它会使许多查询检索所有数据,并且它需要很长时间。我怎样才能更有效地做到这一点?感谢帮助!嵌套模型的计数总和

您可以手动将counter_cache的想法扩展为某种sum_cache,我们称之为nested_ads_count

话,那就需要处理

  • 4一般情况下,一个类别获取新添加
  • 一类是“移动/添加”到一个新的父类”
  • 类别被删除(或从父删除)”

after_update回调,更新家长的nested_ads_count时,无论是当前的nested_ads_countads_count更新。解决了第一种情况。

awesome_nested_set使用after_addafter_remove回调重新计算nested_ads_count解决了2例

计算和缓存nested_ads_count是这样

def reset_nested_ads_count 
    self.nested_ads_count = some_nested_categories.sum(:nested_ads_count) + self.ads_count 
end 

这种方法,该方法是最佳的当频率所使用的计数大于频率,它是更新更大,因为它只做了当数字将被更新时,而不是当需要查看数字时,这是非常耗时的查询。

有一种可能发生的错误,那就是如果你在嵌套中有一个循环(a> b> a,或者甚至更危险a> b> c> ...> a)你可以得到自己在无限循环中。我还没有看到任何明确说明awesome_nested_set阻止这种情况。

+0

外观和听起来不错,thx – Mart17