2009-03-29 5 views
2

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_attribute
nicht funktioniert? Gibt es außerdem einen besseren Ansatz?

+0

Das sind also keine normalen AR-Attribute, sondern Instanzmethoden in Ihrem Modell? Und "werden nicht richtig in Ihre Datenbank geschrieben" - was meinst du damit? –

+0

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

Antwort

1

Stellt sich heraus, dass das, was ich tat, in Ordnung war. Das eigentliche Problem war, dass das "id" -Lookup des Objekts von einem Code, den ich woanders hatte, übertrumpft wurde. I.e. Der tatsächliche Schreibvorgang fand in der Datenbank statt, jedoch mit dem falschen Primärschlüssel.

-1

Müssen Sie nach dem write_attribute nicht "save" aufrufen?

+0

Warum wurde das geändert? Verlangt write_attribute nicht, dass Sie immer noch save aufrufen müssen, um das Update zu veröffentlichen? – bhollis