dla wszystkich poniższych zakładają one:konsekwentna obliczenia atrybutów z systemu kolejkowania
- szyny v3.0
- rubin v1.9
- Resque
Mamy 3 modele:
- Produkt belongs_to: sku, belongs_to: kategoria
- Sku has_many: produkty, belongs_to: kategoria
- Kategoria has_many: produkty, has_many: SKU
Kiedy zaktualizować produkt (powiedzmy, że wyłączenie to) musimy mieć pewne rzeczy związane z odpowiednim sku i kategorią. To samo dotyczy aktualizacji sku.
Jednym ze sposobów osiągnięcia tego jest after_save
dla każdego modelu, który wyzwala zdarzenia aktualizacji innych modeli.
przykład:
products.each(&:disable!)
# after_save triggers self.sku.products_updated
# and self.category.products_updated (self is product)
Teraz, jeśli mamy 5000 produktów jesteśmy w leczeniu. Ta sama kategoria może zostać zaktualizowana setki razy i przejąć bazę danych podczas tego procesu.
Mamy również ładny system kolejkowania, więc bardziej realistyczny sposób aktualizacji produktów będzie products.each(&:queue_disable!)
, który po prostu wrzucił 5000 nowych zadań do kolejki pracy. Problem aktualizacji kategorii 5000 nadal istnieje.
Czy istnieje sposób na uniknięcie tych wszystkich aktualizacji na db?
W jaki sposób można połączyć wszystkie kategorie. Products_updated dla każdej kategorii w kolejce?
Dlaczego musisz aktualizować kategorię po zmianie produktu? Czy jest to przeciwna średnia cena, czy co? Jeśli tak, upuść licznik pamięci podręcznej i oblicz go, kiedy jest potrzebny, lub użyj http://redis.io/. –