Ich entwickle ein System (mit Rails 2.3.2, Ruby 1.8.7-p72), die eine beträchtliche Reporting-Komponente hat. Um die Leistung zu verbessern, habe ich ein Berichtsmodell erstellt, um alte Berichte zu archivieren. Die Idee ist, dass, wenn ein übereinstimmender Bericht bereits für einen beliebigen Satz von Bedingungen existiert, dieser verwendet wird, ansonsten den Bericht generieren und die Ergebnisse speichern.Lazy Laden/Zwischenspeichern von SQL-Abfrage-Ergebnissen mit einem Modell
Darüber hinaus möchte ich das Berichtsmodell so entwerfen, dass nur die angeforderten Attribute ihre entsprechenden SQL-Abfragen ausführen. Das alles rührt von der Tatsache her, dass jedes Attribut eine lange Zeit für die Berechnung benötigt und ich lieber keine Ergebnisse erzeugen möchte, die nicht verwendet werden. I.e. Ich möchte wie etwas tun:
def foo @foo ||= read_attribute(:foo) if @foo.nil? @foo = write_attribute(:foo, (expensive SQL query result)) end @foo end
Das Problem ich erlebe, ist jedoch, dass die Ergebnisse nicht richtig in meine Datenbank geschrieben werden und als Ergebnis wird der Code ständig neu zu bewerten den SQL Abfrage.
Kann mir jemand sagen, warum
write_attributenicht funktioniert? Gibt es außerdem einen besseren Ansatz?
Das sind also keine normalen AR-Attribute, sondern Instanzmethoden in Ihrem Modell? Und "werden nicht richtig in Ihre Datenbank geschrieben" - was meinst du damit? –
Welche Version von Rails sind Sie? Ziehen Sie stattdessen die Verwendung von update_attribute in Betracht: write_attribute wurde seit Version 2.0 aktualisiert. – hgmnz