Я использую кеширование на уровне сериализатора, которое в основном работает именно так, как я хочу (например, модель updated_at изменяется, а связанный сериализатор становится недействительным в кеше).
Однако в некоторых случаях мне нужно иметь возможность вручную настроить таргетинг на конкретный сериализатор и заставить его сделать недействительным свой кеш. Например, в настоящее время мы создаем функцию вопросов и ответов, сериализатор вопросов содержит last_answer_at и answer_count. Я хочу, чтобы вопрос кэшировался как можно дольше, так как он редко меняется, однако, если создается новый ответ или существующий ответ удаляется, я хочу иметь возможность настроить таргетинг на связанный вопрос и сделать его недействительным. кеш.
Я немного изучил это и обнаружил, что вы можете получить ключ кеша, используя:
serializer = QuestionSerializer.new(self)
adapter = ActiveModelSerializers::Adapter.create(serializer)
cache_key = serializer.cache_key(adapter)
Однако это не включает часть атрибутов ключа кэша.
Здесь я надеюсь добиться того, что родительский объект (в моем примере вопрос) будет содержать такой метод, как:
def clear_cache
Rails.cache.clear(cache_key)
end
def cache_key
serializer = QuestionSerializer.new(self)
adapter = ActiveModelSerializers::Adapter.create(serializer)
serializer.cache_key(adapter)
end
... и в моем дочернем объекте вызывайте его при создании или удалении ответов.
after_create :clear_parent_cache
def clear_parent_cache
question.clear_cache
end
Есть ли лучший способ сделать это? Можете ли вы порекомендовать способ последовательного получения правильного ключа кэша?
Спасибо, Дэн
Примечание. Эта проблема также упоминается в репозитории Github (https://github.com/rails-api/active_model_serializers/issues/1816), разместив его здесь, чтобы его увидела более широкая аудитория.