2017-07-28 91 views
0

我有兩個模型:類別廣告類別has_many:廣告 +我加了計數器緩存:ads_count。我使用gem awesome_nested_set製作嵌套類別,因此Category1可以是Category2的父/子,可以是Category3的父類等。我需要的是我的類別#索引是計算屬於某個類別或子類別的廣告的總數類別(或「孫子」等)。我現在的解決方案是:some_nested_categories.sum(:ads_count)。但是讓我們說,如果我的索引頁中有許多類別,它會使許多查詢檢索所有數據,並且它需要很長時間。我怎樣才能更有效地做到這一點?感謝幫助!嵌套模型的計數總和

回答

0

您可以手動將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