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/