2017-07-28 4 views
0

Ich habe zwei Modelle: Kategorie und Anzeige. Kategorie has_many: Anzeigen + Ich habe hinzugefügt Counter-Cache: ads_count. Ich benutze Edelstein awesome_nested_set zu verschachtelten Kategorien, so kann Category1 Eltern/Kind von Category2 sein, die Eltern von Category3 usw. sein können. Was ich für meine Kategorien # Index brauche, ist die Gesamtsumme von Anzeigen, die zu bestimmten Kategorie oder Kind gehören Kategorie (oder "Enkel" usw.). Meine Lösung für jetzt ist: some_nested_categories.sum (: ads_count). Aber sagen wir, wenn ich viele viele Kategorien in meiner Indexseite habe, macht es viele Abfragen, um alle diese Daten abzurufen, und es dauert zu lange. Wie kann ich das effizienter machen? Danke für die Hilfe!Summe der Zählerstände für verschachtelte Modelle

Antwort

0

Sie könnten die Idee der counter_cache manuell für eine Art von sum_cache erweitern, können wir es nested_ads_count nennen.

es dann 4 allgemeine Fälle werden würde, die behandelt werden müssen, wird

  • eine Kategorie ein neues
  • hinzufügen
  • eine Kategorie „bewegt/hinzugefügt“ auf eine neue Hauptkategorie“
  • eine Kategorie wird „

ein after_update Rückruf, der die Eltern aktualisiert gelöscht (oder von einem übergeordneten entfernt) nested_ads_count, wenn entweder der Strom oder die nested_ads_countads_count Aktualisierungen. löst den ersten Fall.

awesome_nested_set löst die anderen 2 Fällen

Verwendung eines after_add und after_remove Rückrufe die nested_ads_count neu berechnen.

Verfahren zu berechnen und die nested_ads_count cachen wie diese

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

Diese Methode aussehen würde, ist optimal, wenn die Frequenz, dass die Zählung verwendet wird, ist größer als die Frequenz, dass es aktualisiert wird, da es die einzige tut zeitaufwendige Abfragen, wenn die Nummer aktualisiert würde, und nicht wenn die Nummer angezeigt werden soll.

Es gibt eine mögliche Fallgrube, die passieren kann, und das ist, wenn Sie eine Schleife in Ihrer Verschachtelung haben (a> b> a oder sogar heimtückischer a> b> c> ...> a) Sie können sich selbst erhalten in einer Endlosschleife. Ich habe nichts explizit gesehen, das besagt, dass "awesome_nested_set" diesen Fall blockiert.

+0

sieht gut aus, thx – Mart17

Verwandte Themen