Wie kann ich die cache-Methode mit Ruby/Rails?
Habe ich eine teure (zeitaufwendig), externe Anforderung mit einem anderen web-service, den ich machen muss, und ich möchte zwischengespeichert. Also habe ich versucht, auf diese idiom, indem Sie den folgenden in der application-controller:
def get_listings
cache(:get_listings!)
end
def get_listings!
return Hpricot.XML(open(xml_feed))
end
Wenn ich rufe get_listings!
in meinem controller ist alles cool, aber wenn ich Anrufe get_listings
Schienen sich beschwert, dass kein block gegeben wurde. Und wenn ich sehe, dass die Methode, die ich sehen, dass er tatsächlich erwarten, dass ein block, und zusätzlich wie es aussieht, ist diese Methode nur für den Einsatz in Aussicht? Also ich vermute, dass, obwohl es war nicht angegeben, daß das Beispiel ist nur pseudocode.
Also meine Frage ist, wie kann ich den cache so etwas? Ich habe versucht, verschiedene andere Möglichkeiten, aber konnten nicht es herauszufinden. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als nruth schlägt, Schienen " built-in cache-speichern ist wahrscheinlich das, was Sie wollen.
Versuchen:
fetch() holt sich den zwischengespeicherten Wert für den angegebenen Schlüssel, oder schreibt das Ergebnis des Blocks in den cache, wenn es nicht vorhanden ist.
Standardmäßig die Schienen-cache verwendet die Datei speichern, aber in einer Produktionsumgebung, memcached ist die bevorzugte option.
Siehe Abschnitt 2 http://guides.rubyonrails.org/caching_with_rails.html für mehr details.
ein-code-Ansatz könnte wie folgt Aussehen:
die cache das Ergebnis auf einer pro-Anfrage-basis (neue controller-Instanz pro Anfrage), Sie können aber auch ein Blick auf die "memoize" Helfer eine api option.
Wenn Sie möchten, zu teilen und diese über Anfragen hinweg nicht speichern Daten auf die Klasse Objekte, wie Ihre app nicht threadsicher, es sei denn, Sie sind gut im concurrent programming & sicherstellen, dass die threads nicht gegenseitig stören, ist der Zugriff auf die Daten auf der freigegebenen variable.
Den "rails Weg" zum cache über Anträge ist die Schienen.cache-Speicher. Memcached wird viel benutzt, aber vielleicht finden Sie die Datei oder den Speicher für Ihre Bedürfnisse. Es hängt wirklich davon ab, wie, die Sie bereitstellen, und ob Sie möchten, um zu priorisieren, cache-hits, Einstellzeit, Speicher (RAM) oder eine gehostete Lösung wie z.B. eine heroku-addon.
Können Sie die cache_method gem:
In Ihrem code:
Bemerken Sie möglicherweise entledigte ich mich
get_listings!
. Wenn Sie einen Weg, um die Daten manuell aktualisieren, schlage ich vor:Hier ist ein weiterer Leckerbissen:
Können Sie auch cachethod gem (https://github.com/reneklacan/cachethod)
Dann ist es tödlich, einfach den cache-Methode ein Ergebnis
Es unterstützt auch das argument level caching
Es wurde vorgeschlagen
cache_method
Juwel, obwohl es ziemlich schwer ist. Wenn Sie brauchen, um rufen Sie die Methode ohne Argumente, die Lösung ist ganz einfach:dann können Sie es in jeder Klasse:
Hinweis - dies wird auch cache-null, das ist der einzige Grund, es zu benutzen, anstatt
@cached_value ||=
Anderen Antworten sind gut, aber wenn Sie möchten, eine einfache von hand gerollt Ansatz können Sie dies tun. Eine Methode definieren, wie die unten in deiner Klasse...
Danach, für jede Methode, die Sie Zwischenspeichern möchten, Sie können wickeln Sie die Methode Körper so etwas wie dieses...
Einer Sache, dass diese besser ist als die einfachste Methode, die oben aufgeführt ist, dass es ein cache nil. Es hat die Bequemlichkeit, die es nicht erfordern, doppelte Methoden. Wohl dem gem-Ansatz ist sauberer, aber.
Spät zur party, aber wenn jemand kommt hier zu suchen.
Verwende ich zur Durchführung dieses kleine Modul, um von Projekt zu Projekt, ich finden es praktisch und erweiterbar genug, ohne das hinzufügen einer extra-gem. Es verwendet die
Rails.cache
backend, so verwenden Sie es bitte nur, wenn Sie eine haben.Dann in einem Initialisierer:
Dann in einem Modell:
An dieser Stelle, es funktioniert nur mit Modellen, kann aber leicht verallgemeinert.