在active_model_serializers 0.10.0上使缓存失效的建议方法是什么?

时间:2016-06-21 17:12:11

标签: ruby-on-rails caching active-model-serializers

我正在使用序列化程序级别的缓存,这主要与我想要的完全一致(例如模型的updated_at更改以及关联的序列化程序在缓存中失效)。

但是,在某些情况下,我需要能够手动定位特定的序列化程序并使其无效。例如,我们目前正在构建问答功能,问题序列化程序包含last_answer_at和answer_count。我希望尽可能长时间缓存该问题,因为它很少更改,但是如果创建了新答案或删除了现有答案,我希望能够定位关联问题并使其无效缓存。 / p>

我对此进行了一些调查,发现您可以使用以下方法获取缓存密钥:

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)上的一个问题,在此发布以确保更广泛的受众可以看到它。

1 个答案:

答案 0 :(得分:0)

我认为这不是AMS的直接问题。

有一个really nice RailsCast on this matter。只是引用必要的:

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

添加:touch =&gt;属于belongs_to关系的true表示当创建,更新或销毁注释时,它所属的文章被触及。