Каков рекомендуемый подход для аннулирования кеша в active_model_serializers 0.10.0?

Я использую кеширование на уровне сериализатора, которое в основном работает именно так, как я хочу (например, модель 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), разместив его здесь, чтобы его увидела более широкая аудитория.


person Daniel Rosewarne    schedule 21.06.2016    source источник


Ответы (1)


Я не думаю, что это имеет непосредственное отношение к AMS.

На эту тему есть отличный RailsCast. Просто процитирую главное:

class Comment < ActiveRecord::Base
  belongs_to :article, :touch => true
end

Добавление :touch => true к отношению contains_to означает, что при создании, обновлении или уничтожении комментария затрагивается статья, которой он принадлежит.

person chrisandrew.cl    schedule 23.06.2016