2015-06-14 3 views
9

pg-ruby können Sie mehrere Anfragen an die Datenbank in einem Schuss senden, die die Anzahl der Fahrten an der Datenbank minimieren hilft:Convert PG :: Ergebnis auf ein Active Record Modell

results = [] 
conn.send_query('QUERY1;QUERY2;QUERY3') 
conn.block 
while result = conn.get_result 
    results << result 
end 

Da für jede result Ich kenne das Active Record-Modell bereits, was ist der geeignete Weg, um das Ergebnis in Modelle zu konvertieren? Im Moment habe ich folgendes mache:

fields = result.fields 
models = result.values.map { |value_set| 
    Model.new(Hash[fields.zip(value_set)]) 
} 

Das Problem bei dieser Methode ist, dass jeder der Active Record-Objekte nicht seine #persisted? erscheinen, da sie mit .new instanziiert worden sind.

Antwort

5

Ich denke, was Sie wollen, ist die ActiveRecord::Base.instantiate Methode. Es wird das Problem new_record?/persisted? korrekt behandeln und die richtige Klasse für die Vererbung einzelner Tabellen finden.

Zum Beispiel:

fields = result.fields 
models = result.values.map { |value_set| 
    Model.instantiate(Hash[fields.zip(value_set)]) 
} 
0

Es ist sieht aus wie ein Hack, aber trotzdem

fields = result.fields 
models = result.values.map { |value_set| 
    hash = Hash[fields.zip(value_set)] 
    model = Model.new(hash) 
    # some attributes may not be assigned i.e. id, created_at and updated_at 
    # in that case you can assign them manually: 
    # model.id = hash["id"] 
    model.instance_variable_set :@new_record, false 
    model 
}