嵌套模型的计数总和
问题描述:
我有两个模型:类别和广告。 类别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_count
或ads_count
更新。解决了第一种情况。
awesome_nested_set使用after_add
和after_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阻止这种情况。
外观和听起来不错,thx – Mart17