Leggere SQL prodotto da ActiveRecord

Ciao a tutti,

piccola domanda forse banale: qualcuno sa se è possibile leggere l’SQL
prodotto da ActiveRecord per la lettura dei dati sul db ?

Mi spiego meglio, se io faccio una interrogazione inserendo le
:conditions l’oggetto AR crea ed esegue lo statement sql select che si
può vedere tramite log.

Avrei la necessità di recuperare l’sql generato a livello di
applicazione (es. appena dopo l’esecuzione del find), è possibile ?

Grazie.

Gianluca T. wrote:

Mi spiego meglio, se io faccio una interrogazione inserendo le
:conditions l’oggetto AR crea ed esegue lo statement sql select che si
può vedere tramite log.

Avrei la necessità di recuperare l’sql generato a livello di
applicazione (es. appena dopo l’esecuzione del find), è possibile ?

Che differenza c’è tra i due casi? Che significa “a livello di
applicazione”?

Luca

Ciao Luca

quello che vorrei ottenere è riuscire ad estrarre l’SQL prodotto da una
istruzione tipo:

Person.find(:all, :include => :addresses, :conditions => [“first_name
like ? and last_name like ?”, first_name, last_name)

perchè avrei necessità di memorizzare l’intero statement sql e mi
tornerebbe comodo averlo direttamente dall’active record, se si può fare…

Ciao Gianluca,
Quindi ti serve a eseguire e memorizzare lo statement SQL a runtime?
Beh, quello che mi viene in mente è una strada non proprio ottimale ma
che potrebbe funzionare. In teoria basterebbe applicare il pattern
observer al metodo find_by_sql per vedere cosa “passa di lì”.
Infatti, tutti i finder di ActiveRecord compongono una query che poi
viene passata come parametro a find_by_sql, il problema sta nel capire
qual è lo statement che ti interessa memorizzare.

Una curiosità: come mai hai questa
necessità?
Luca

Ciao Luca,

ho risolto richiamando da dentro il model il metodo
sanitize_sql(conditions) che a partire dalle conditions ([sql,
parametri…]) applicate al finder mi genera lo statement finale sql
where…

La motivazione per fare cìò è dettata dall’esigenza di salvare dei
filtri di selezione applicati a dei model in modo che in seguito possano
essere riapplicati dall’utente.

ho risolto richiamando da dentro il model il metodo
sanitize_sql(conditions) che a partire dalle conditions ([sql,
parametri…]) applicate al finder mi genera lo statement finale sql
where…

La motivazione per fare cìò è dettata dall’esigenza di salvare dei
filtri di selezione applicati a dei model in modo che in seguito possano
essere riapplicati dall’utente.

Una volta, affrontando un problema simile, ho avuto l’idea di fare una
cosa simile:

def conditions=(q)
self.query = Marshal.dump(q)
end

def conditions()
return Marshal.load(self.query)
end

in un model, per poterli salvare nel database.


David N. Welton

http://www.welton.it/davidw/

http://www.dedasys.com/