Wie kann ich die JSON-Repräsentation eines Objekts zwischenspeichern?

8

In der JSON -Darstellung meines Car -Modells schließe ich die Ausgabe einer teuren Methode ein:

%Vor%

Ich habe eine Standard-Indexaktion:

%Vor%

Ich benutze auch die JSON Darstellungen von Autos an anderen Orten, so:

%Vor%

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.

    
ben 11.11.2013, 19:19
quelle

3 Antworten

2

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.

    
Vidya 20.11.2013, 00:31
quelle
2

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.

    
severin 14.11.2013 09:26
quelle
0

Ich bin nicht sicher, ob ich folge, aber ich denke, ich würde serialize-Feld dafür verwenden

Ссылка

und before_save Callback zum Aktualisieren dieses Felds nach Änderung des Schienenmodells.

%Vor%     
Slawek 11.11.2013 22:54
quelle

Tags und Links