2016-06-21 35 views
2

我在序列化器级别使用高速缓存,主要完全按照我想要的那样工作(例如,模型的updated_at更改以及关联的序列化器在高速缓存中无效)。什么是使active_model_serializers 0.10.0上的缓存失效的推荐方法?

但是,在某些情况下,我需要能够手动锁定某个特定的序列化程序并使其无效。作为一个例子,我们目前正在构建一个问题和回答功能,问题序列化程序包含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)的问题,在这里张贴,以确保它是更广泛的受众可见。

回答

0

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

有一个really nice RailsCast on this matter。只是引述必不可少的:

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

添加:触摸=>真到了belongs_to的关系意味着创建注释时,更新或销毁的文章属于被触摸。

相关问题