Schienen.cache.fetch, Symbole & Memcached
Ich habe eine rails-2.3.4-app und eine Zeile, die sieht wie folgt aus:
temp = Rails.cache.fetch(:temp_id) { User.find_by_name('Temp').id }
und alles hat gut funktioniert, bis ich beschlossen, zu wechseln, der Cache-Ebene zu memcached durch hinzufügen des folgenden in meiner Umgebung.rb:
config.cache_store = :mem_cache_store
Nun die Linie, die gut funktioniert gibt mir die folgende Fehlermeldung:
undefined method 'length' for :temp_id:Symbol
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb:645:in 'get_server_for_key'
Verstehe ich die Fehler, aber ich könnte mir vorstellen, das häufiger der Fall gewesen wäre schnell entdeckt Schienen Testfall, so Frage ich mich, wenn ich mache etwas falsch. Ansonsten bin ich mir sicher, ich kann monkeypatch dieses Problem zu konvertieren, das symbol in eine Zeichenfolge.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur die Verwendung von string-Schlüssel, wenn Sie können. Alle Dokumentation Beispiele die Verwendung von string-Schlüssel. Obwohl es nicht explizit erwähnt, so weit ich sehen kann, die anderen Tasten werden nicht unterstützt.
Die wichtigsten Argumente direkt übergeben werden, um die cache-Implementierung, so dass die verschiedenen caching-Aromen können sich nicht einig, ob oder nicht Sie akzeptieren nichts anderes als strings.
Da die caches sind externe, mit Ausnahme der in-memory-cache, ich bin mir nicht sicher, dass die Unterstützung von Symbolen nützlich wäre neben der Vermeidung von Fällen wie dem ihrigen. Der Schlüssel wird tatsächlich so geschrieben, um eine Ausgabe irgendwo (nicht nur intern, um Ihre Ruby-app), so dass begrifflich der Schlüssel sollte ein string sein.
Bearbeiten in Reaktion auf Kommentar: ja, es ist natürlich auch möglich und durchaus sinnvoll in diesem Fall erstellen Sie eine monkey patch zu umgehen, ändern Sie alle Anrufe. Was Sie ' re darauf hindeutet, ist dies (kopiert und in die Antwort zur besseren Lesbarkeit):
Ich würde auch in Betracht ziehen gerade dabei ein Projekt weite suchen-und-ersetzen für
\.fetch(:\w+)
und ersetzen Sie es mit\.fetch("$1")
(wiederholen Sie fürread
undwrite
falls erforderlich). Dies sollte wohl decken 95% aller Fälle und einer nachfolgenden Ausführung der test-suite fangen sollte der rest der Fehler.Im Allgemeinen: Während die Dokumentation von Rails ist ziemlich gut in diesen Tagen, eine Menge von Annahmen sind leider noch implizit. Es ist generell eine gute Idee, nehmen Sie einen guten Blick auf die Beispiele, die gegeben werden, in die Dokumentation, und verwenden Sie den gleichen Stil. Die dokumentierten Beispiele sind immer, wie das framework verwendet werden soll.
can too
tun styling in Kommentare. Meistens.FWIW, es ist kanonisch Schienen.cache.Lesen und Schienen.cache.schreiben.