2016-06-21 15 views
2

Ich verwende Caching auf der Serializer-Ebene, die meist genau so funktioniert, wie ich es möchte (z. B. die Änderungen am updated_at des Modells und der zugehörige Serializer werden im Cache ungültig gemacht).Was ist der empfohlene Ansatz zum Invalidieren des Cache auf active_model_serializers 0.10.0?

In einigen Fällen muss ich jedoch in der Lage sein, einen bestimmten Serializer manuell zu targetieren und dessen Cache ungültig zu machen. Als Beispiel erstellen wir derzeit eine Frage-und-Antwort-Funktion, der Frage-Serializer enthält last_answer_at und answer_count. Ich möchte, dass die Frage so lange wie möglich zwischengespeichert wird, da sie sich selten ändert. Wenn jedoch eine neue Antwort erstellt oder eine vorhandene Antwort gelöscht wird, möchte ich die zugehörige Frage gezielt ansprechen und deren Cache ungültig machen können.

Ich habe das ein bisschen untersucht und festgestellt, dass Sie den Cache-Schlüssel unter Verwendung erhalten können:

serializer = QuestionSerializer.new(self) 
adapter = ActiveModelSerializers::Adapter.create(serializer) 
cache_key = serializer.cache_key(adapter) 

jedoch, dass nicht die Attribute Teil des Cache Schlüssel enthält.

Was ich hoffe, hier zu erreichen, besteht darin, dass ein übergeordnetes Objekt (in meinem Beispiel eine Frage), ein Verfahren, wie beispielsweise enthalten würde:

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 

... und in meinem Kind-Objekt, rufen Sie es beim Erstellen oder Löschen von Antworten.

after_create :clear_parent_cache 

def clear_parent_cache 
    question.clear_cache 
end 

Gibt es einen besseren Weg, dies zu tun? Können Sie einen Weg empfehlen, den korrekten Cacheschlüssel konsistent zu erhalten?

Danke, Dan

Hinweis: Diese auch als ein Problem auf dem Github Repo (https://github.com/rails-api/active_model_serializers/issues/1816) angehoben wird, hier zu veröffentlichen, es ist ein breiteres Publikum zu gewährleisten sichtbar.

Antwort

0

Ich glaube nicht, dass dies ein direktes Problem für AMS ist.

Es gibt eine really nice RailsCast on this matter. Nur unter Angabe der wesentlich:

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

Hinzufügen: touch => getreu dem belongs_to Beziehung bedeutet, dass, wenn ein Kommentar erstellt, aktualisiert oder den Artikel zerstört es gehört berührt wird.