Wie erstellt man eine lazy loaded Eigenschaft in Ruby für ein Model?

8

Ich möchte eine Lazy-Loaded-Eigenschaft erstellen, die eine Auflistung in einem Model zurückgibt, wie mache ich das?

Ich möchte keine Assoziation dafür erstellen.

Ich möchte also eine Sammlung zurückgeben, wenn die Sammlung noch nicht initialisiert wurde, dann die Datenbank ankreuzen, die Zeilen zurückgeben und dann initialisieren.

Wenn es einmal ausgeführt wird, muss es nicht erneut ausgeführt werden, da die nächste Seitenanforderung die Dinge neu beginnen wird.

    
Blankman 07.03.2011, 16:25
quelle

2 Antworten

19

Fügen Sie ein Instanzattribut hinzu (z. B. @my_attribute )

Und dann definieren

%Vor%

(Hinweis: initialize_my_attribute ist eine von Ihnen implementierte Funktion / Methode, die den gewünschten Wert lädt.)

Wie das funktioniert: Das Attribut beginnt mit einem nil Wert (wir haben ihm nichts zugewiesen). Die Objektinstanz kann nicht direkt darauf zugreifen, weil wir keinen Attribut-Accessor darauf definiert haben. Stattdessen haben wir eine Methode, die exakt den gleichen Namen wie das Attribut hat. Wenn Sie also my_object.my_attribute aufrufen, sieht es genauso aus, als würden Sie auf das Attribut zugreifen, wenn Sie tatsächlich die Methode der Objektinstanz aufrufen.

Was passiert in der Methode? Der ||= Short Hand entspricht

%Vor%

Wenn also @my_attribute bereits einen Wert hat, wird dieser Wert zurückgegeben. Andernfalls erhält @my_attribute einen Wert zugewiesen (und dann zurückgegeben). Mit anderen Worten: Der Wert wird beim ersten Zugriff (und nur beim ersten Mal) in @my_attribute geladen.

Und voila! Faules Laden.

    
David Sulc 07.03.2011, 16:50
quelle
0

Zugehörige Eigenschaften werden standardmäßig lazy-geladen. Überprüfen Sie Ihre Protokolle, um sicherzustellen, dass Abfragen an die Datenbank nur ausgeführt werden, wenn auf die Eigenschaft zugegriffen wird.

Ich bin auch auf dieses Problem gestoßen. Und nachdem ich meine selbstgemachten Lazy-Loading-Funktionen implementiert hatte, erkannte ich, dass sie bedeutungslos waren. Durch Hinzufügen von Lazy-Loadern, wie oben beschrieben, fügen Sie dem internen Lazy-Loader einen Lazy-Loader hinzu, der die Leistung verlangsamt, ohne einen Wert hinzuzufügen.

    
Charma 23.04.2014 12:00
quelle

Tags und Links