Ответ 1
Я тоже наткнулся на себя.
Короткий ответ. С этой проблемой нелегко. Все touch
es завернуты в ту же транзакцию, следовательно, тупик.
Длинный ответ. Я предполагаю, что вам нужны сенсорные объекты, чтобы аннулировать некоторые (зависимые) кеши. Обычно рекомендуемое использование touch
работает только для ограниченного количества "отношений". Например. аннулирование статьи при обновлении комментария.
Моим решением была асинхронная коллекция (с использованием задания sidekiq) объектов БД, которые должны быть недействительными. Я написал для себя свою собственную логику управления, которая определяет, какие (другие) объекты должны быть аннулированы при изменении объекта. Например. комментарий == > статья.
Таким образом, у нас был более сложный способ аннулирования зависимых объектов. Плюс я признал недействительным, используя Model.update_all
, который был быстрее, чем "сенсорная цепочка". Он решил наши проблемы с тупиком (и добавил многословие и производительность к недействительности кеша).
Дополнительный совет: не используйте updated_at
. Это очень спорно, если объект DB действительно изменился, потому что другой объект изменился. Перезапись модели cache_key
позволяет легко определить пользовательский кеш-ключ, например "#{id}-#{valid_from}"
. valid_from
может быть временной меткой, которую вы определяете на своих моделях (и которую вы используете вместо updated_at
).