Rails: counter_cache не запускает обратный вызов after_update
-
29-10-2019 - |
Вопрос
Итак, у меня есть модели Folder и FolderItem.
< sizesUPDATE родовое слово
Я использую counter_cache, чтобы сохранить количество itens в одной папке.Но папка может быть родительской для другой папки, и я хотел, чтобы в родительской папке была сумма counter_cache всех ее дочерних элементов плюс собственный counter_cache.
Для этого я попытался добавить метод after_update, кэширующий изменения, сделанные в столбце counter_cache, но почему-то этот метод не вызывается при создании нового FolderItem.
Решение
Я бы сделал что-то подобное.
Добавить поля счетчика кеша в таблицу папок
родовое словоИ код Ruby
родовое слово Обратите внимание, что метод Folder#sum_of_children
является рекурсивным, поэтому для больших наборов данных он может замедлить работу вашего приложения.Возможно, вы захотите сделать с ним еще немного магии SQL, но в чистом виде Ruby это настолько близко к хорошему решению, насколько это возможно.Я видел, что вы сделали наоборот, это будет так же медленно, как и вам нужно обновляться снизу вверх.(Это сверху вниз)
Не знаю, ищете ли вы это, но это удобочитаемое решение для кэширования количества элементов в папке.