In der JSON
-Darstellung meines Car
-Modells schließe ich die Ausgabe einer teuren Methode ein:
Ich habe eine Standard-Indexaktion:
%Vor% Ich benutze auch die JSON
Darstellungen von Autos an anderen Orten, so:
Da die JSON
-Darstellung eines car
an mehreren Stellen verwendet wird, möchte ich, dass sie eigenständig zwischengespeichert wird, wobei car.cache_key
als automatisch auslaufender Cacheschlüssel verwendet wird.
So mache ich es gerade:
%Vor% Das Einfügen des Cache-Codes in as_json
ist jedoch nicht korrekt, da das Caching nicht Teil der Verantwortlichkeit von as_json
ist. Was ist der richtige Weg, dies zu tun? Ich benutze Rails 3.2.15.
Lassen Sie mich zunächst sagen, dass ich die Mühe dieser Frage begrüße. Sie werden es schwierig finden, jemanden zu finden, der mehr daran interessiert ist, Software auf die richtige Art und Weise zu entwickeln - auch mit kleinen Methoden, die eine Sache auf einer Abstraktionsebene gut machen - als ich.
Allerdings muss ich sagen, dass ich mich auf diese Frage tatsächlich gegen die Prämisse der Frage stelle. Ich denke, Ihr as_json
ist am besten so wie es ist.
Was mehr zählt, ist die Entkopplung von Clients von Implementierungen. Das einzige, was Clients von Car#as_json
wissen müssen, ist, dass der Rückgabewert die JSON-Repräsentation von Car
ist. Und as_json
macht das Ding und macht es gut. Das Zwischenspeichern und / oder Holen ist ein Implementierungsdetail, das innerhalb der Methode bleiben sollte, und es ist ein Detail, das für diese eine Aufgabe wesentlich ist.
Etwas anderes zu sagen, wäre so, als ob jede Methode mit einer if
-Anweisung "falsch" ist, weil sie zwei Dinge tut. Natürlich ist das nicht wahr. In beiden Fällen (mit if
und Rails.cache.fetch
) ist die Methodenimplementierung eine atomare Aktion, deren Ergebnis auf einer Bedingung basiert.
Das ist eine Sache, die auf zwei Arten gehen kann, was nicht dasselbe ist wie zwei Dinge.
In der Zwischenzeit müsste ich der Antwort von @ severin widersprechen. Es wird natürlich funktionieren, aber Sie haben nun Ihre Ansicht mit einem Implementierungsdetail verknüpft. Nichts, und schon gar nicht Ihre Ansicht, sollte eine Vorstellung von der Methode des Caching oder sogar von der Caching-Funktion haben. Meiner Meinung nach haben Sie mit diesem Ansatz eine Abstraktion durchgesickert. Vielleicht ist es egal, aber da wir über den "richtigen Weg" sprechen, Dinge zu tun ...
Also sage ich, halte die Dinge so, wie sie sind. Aber ich glaube, es ist eine großartige Frage.
Ich stelle das Caching immer in die as_json
-Methode (und das active_model_serializer -Element tut das auch), aber deine Bemerkung darüber, dass das nicht korrekt ist, hat mich zum Nachdenken gebracht und ich kann deine Bedenken verstehen.
Also habe ich die respond_with
-Dokumentation durchgesehen (siehe Linkbeschreibung hier eingeben ) und ich fand das:
Wenn ein akzeptables Format nicht identifiziert wird, gibt die Anwendung den Status '406 - nicht akzeptabel' zurück. Andernfalls besteht die Standardantwort darin, eine Vorlage zu rendern, die nach der aktuellen Aktion und dem ausgewählten Format benannt ist, z. index.html.erb. Wenn keine Vorlage verfügbar ist, hängt das Verhalten vom ausgewählten Format ab ...
Sie könnten also eine JSON-Vorlage für die betroffenen Aktionen erstellen und dann das Caching in dieser Ansicht durchführen. Etwas wie folgt sollte funktionieren:
%Vor% Sie können wahrscheinlich die render partial: ...
-Aufrufe ein bisschen aufräumen und dann hätten Sie eine nette Lösung mit dem Caching in der Ansicht, wo es hingehört.
Tags und Links ruby-on-rails json caching