2016-06-21 3 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の関係に真のコメントが作成されたとき、それは触れられ属する記事を更新または破壊することを意味します。

関連する問題