Per tutti i seguenti assumere questi:calcoli attributo Conseguenti con un sistema di accodamento
- rotaie v3.0
- rubino v1.9
- resque
Abbiamo 3 modelli:
- Prodotto belongs_to: SKU, belongs_to: categoria
- Cod has_many: prodotti, belongs_to: categoria
- Categoria has_many: prodotti, has_many: SKU
Quando abbiamo aggiornare il prodotto (diciamo abbiamo disabilitato it) abbiamo bisogno di avere alcune cose che accadono allo sku e alla categoria rilevanti. Lo stesso vale per quando uno sku viene aggiornato.
Il corretta modo per raggiungere questo è avere un after_save
su ogni modello che fa scattare gli eventi di aggiornamento degli altri modelli.
esempio:
products.each(&:disable!)
# after_save triggers self.sku.products_updated
# and self.category.products_updated (self is product)
Ora, se abbiamo 5000 prodotti che sono dentro per un ossequio. La stessa categoria potrebbe essere aggiornata centinaia di volte e incasinare il database mentre lo fa.
Abbiamo anche un buon sistema di accodamento, quindi il modo più aggiornato di aggiornare i prodotti sarebbe products.each(&:queue_disable!)
, che dovrebbe semplicemente aggiungere 5000 nuove attività alla coda di lavoro. Il problema di 5000 aggiornamenti di categoria esiste comunque.
C'è un modo per evitare tutti quegli aggiornamenti sul db?
Come possiamo concatenare tutti i category.products_updated per ogni categoria nella coda?
Perché è necessario aggiornare una categoria quando il prodotto viene modificato? È un contatore un prezzo medio o cosa? In tal caso, rilascia la cache del contatore e calcolala quando è necessaria oppure usa http://redis.io/. –