Для всех следующих предположений:
- рельсы v3.0
- ruby v1.9
- спасательное
У нас есть 3 модели:
- Продукт принадлежит_ к: sku, принадлежит_ к: категории
- Sku has_many: продукты, принадлежащие к: категории
- Категория 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 все еще существует.
Есть ли способ избежать всех этих обновлений на БД?
Как мы можем объединить все category.products_updated для каждой категории в очереди?