2015-06-14 13 views
9

pg-ruby consente di inviare più query al database in un solo colpo, che aiuta a ridurre al minimo il numero di viaggi effettuati alla banca dati:Convertire PG :: Risultato a un modello di Active Record

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

Dato che per ogni result Conosco già il modello Active Record, qual è il modo appropriato per convertire il risultato in modelli? In questo momento sto facendo la seguente:

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

Il problema di questo metodo è che ciascuno degli oggetti Active Record non sembrano essere #persisted? dal momento che sono stati istanziati con .new.

risposta

5

Penso che ciò che si vuole è il metodo ActiveRecord::Base.instantiate. Gestirà correttamente il problema new_record?/persisted? e troverà la classe corretta per l'ereditarietà a tabella singola.

Ad esempio:

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

E 'sembra un hack, ma in ogni caso

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 
} 
Problemi correlati