Schienen-und Klassenvariablen: werden diese bleiben in Benutzer-und server-Anrufe?
Sind wir on Rails 3.0.6.
Wird der folgende code bestehen über die Seite geladen und den Benutzern in Rails? Oder wird es mit jeder Anforderung neu definiert? Der code lebt an der Spitze des Controllers.
@@list = []
hero = {}
hero['name'] = 'so'
hero['superpowers'] = ['coding', 'qa', 'spec_writing']
@@list.push hero
hero2 = {}
hero2['name'] = 'so2'
hero2['superpowers'] = ['coding']
@@list.push hero2
... more Hashes pushed into @@list
Die Liste mit änderungen, die nur einmal im Monat, und wir möchten effizient und schnell diese Daten zur Verfügung Seite Anfragen. Wir werden schließlich verwenden Schienen.cache aus der Datenbank gelesen, aber wir sind mit dem folgenden Ansatz für jetzt (vorausgesetzt, es funktioniert).
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Entwicklung, die Standard-Verhalten ist für die Klasse neu geladen werden auf jede Anfrage, damit das zurücksetzen Ihrer Klasse variable. In der Produktion, aber die Klasse wird initialisiert, sobald und so die class-variable bestehen bleiben über mehrere Anfragen hinweg und mehrere Sitzungen.
Sollten Sie zu einem richtigen caching-Technik, die, sobald Sie können. Sie können, natürlich, bestehen Sie den Wert über die nachladen der Klasse, wenn die Anwendung neu gestartet wird. Außerdem, wenn der web-server ist multi-threaded (wie es wahrscheinlich ist), kann es sein, das ausführen mehrerer Instanzen der Anwendung auf verschiedene threads, die nicht Anteil der Klasse Variablen, die potenziell erstellen von Inkonsistenzen zwischen Anforderungen.
Habe ich kam gerade über das gleiche Problem und fand diesen Beitrag. Ich weiß, es ist eine alte Frage, aber die Veröffentlichung meiner Antwort nur für den Fall jemand anderes Gesichtern ähnliches Problem...
Ich denke, für Fälle, in denen Datenbank oder Schienen.cache kann nicht verwendet werden, aus irgendeinem Grund, dann ist der beste Ort, um diese Werte ist die Application-Klasse. Nur definieren Sie einige attribute an und initialisiert es. Dann ist es leicht, darauf zuzugreifen, nur wie Schienen.- Anwendung.heros. Quick-and-dirty-Beispiel unten:
in config/application.rb
Ich manchmal, was ich als den cache der Armen.
Funktionierte es wie folgt:
in einer Initialisierung, hinzufügen:
MY_CACHE_HASH = {}
wo immer Sie wollen:
MY_CACHE_HASH[:foo] = :bar
überall dort, wo Sie
MY_CACHE_HASH[:foo] #=> :bar
Ich würde es nicht empfehlen obwohl: was würden Sie tun, wenn Ihr server abstürzt?
Wenn Sie Daten haben, die nicht geändert werden, während die Schienen läuft dann ist es gut zu verwenden
@@class_variable
.beachten Sie, dass (in der Standard-Entwicklung Konfiguration) controller-Klassen werden neu geladen bei jeder Anfrage, so dass, wenn Sie brauchen, um zu sagen, lese die Daten aus einer Datei, in Erwägung ziehen, den code zum initialisieren der Daten in config/application.rb in einem
$global
oderCONSTANT_VAR
.Also das was du beschreibst ist ein datastructure, die nicht in der Datenbank. Ich halte es durchaus für sinnvoll, Elemente, die "nie" ändern im code und nicht in der Datenbank.
zum Beispiel könnten Sie haben:
In app/models/held.rb
Dann später in Ihrem code, Sie werden Zugang:
Und später können Sie die swap für eine Datenbank gesichert, wenn Sie müssen, auf.