Для всех следующих предположим, они:Последовательные вычисления атрибутов с системой массового обслуживания
- рельсы v3.0
- рубин v1.9
- спасательное
У нас есть 3 модели:
- Продукт belongs_to: Код, BELONGS_TO: категория
- Sku has_many: продукты, belongs_to: категория
- Категория has_many: продукты, has_many: SKUs
Когда мы обновляем продукт (скажем, мы отключаем это), мы должны иметь некоторые вещи, связанные с соответствующими sku и категорией. То же самое можно сказать и о том, когда обновляется sku.
надлежащим образом способ достижения этой цели: after_save
для каждой модели, которая запускает события обновления других моделей.
пример:
products.each(&:disable!)
# after_save triggers self.sku.products_updated
# and self.category.products_updated (self is product)
Теперь, если мы имеем 5000 продуктов, мы в для лечения. Одна и та же категория может быть обновлена сотни раз и зависеть от базы данных при этом.
У нас также есть прекрасная система массового обслуживания, поэтому более реалистичным способом обновления продуктов будет products.each(&:queue_disable!)
, который просто подбросит 5000 новых задач в рабочую очередь. Тем не менее проблема обновления 5000 категорий все еще существует.
Есть ли способ избежать всех этих обновлений на db?
Как мы можем объединить все категории.products_updated для каждой категории в очереди?
Зачем вам нужно обновлять категорию при изменении продукта? Это счетчик средней цены или что? Если это так, отбросьте кеш-счетчик и вычислите его, когда это необходимо, или используйте http://redis.io/. –