# Leggere SQL prodotto da ActiveRecord

**URL:** <https://www.ruby-forum.com/t/leggere-sql-prodotto-da-activerecord/135156>\
**Category:** IT\
**Created:** [April 18, 2008, 4:34pm UTC](https://www.ruby-forum.com/t/leggere-sql-prodotto-da-activerecord/135156 "2008-04-18T16:34:45Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [April 18, 2008, 4:34pm UTC](https://www.ruby-forum.com/t/leggere-sql-prodotto-da-activerecord/135156/1 "2008-04-18T16:34:45Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [April 18, 2008, 6:14pm UTC](https://www.ruby-forum.com/t/leggere-sql-prodotto-da-activerecord/135156/2 "2008-04-18T18:14:14Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [April 18, 2008, 7:31pm UTC](https://www.ruby-forum.com/t/leggere-sql-prodotto-da-activerecord/135156/3 "2008-04-18T19:31:21Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [April 18, 2008, 10:29pm UTC](https://www.ruby-forum.com/t/leggere-sql-prodotto-da-activerecord/135156/4 "2008-04-18T22:29:18Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [April 22, 2008, 11:45am UTC](https://www.ruby-forum.com/t/leggere-sql-prodotto-da-activerecord/135156/5 "2008-04-22T11:45:55Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![gianluca\_t](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/d78d45/32.png) [@gianluca\_t](https://www.ruby-forum.com/u/gianluca_t)\
**Post date:** [April 22, 2008, 12:53pm UTC](https://www.ruby-forum.com/t/leggere-sql-prodotto-da-activerecord/135156/6 "2008-04-22T12:53:33Z")

</div>

> 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.welton.it/davidw/)

[http://www.dedasys.com/](http://www.dedasys.com/)
