Ruby Forum Italian Ruby user group > Leggere SQL prodotto da ActiveRecord...

Posted by Gianluca Tessarolo (Guest)
on 18.04.2008 16:34
(Received via mailing list)
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.
Posted by Luca Guidi (Guest)
on 18.04.2008 18:14
(Received via mailing list)
Gianluca Tessarolo 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
Posted by Gianluca Tessarolo (Guest)
on 18.04.2008 19:31
(Received via mailing list)
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...
Posted by Luca Guidi (Guest)
on 18.04.2008 22:29
(Received via mailing list)
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
Posted by Gianluca Tessarolo (Guest)
on 22.04.2008 11:45
(Received via mailing list)
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.
Posted by David Welton (Guest)
on 22.04.2008 12:53
(Received via mailing list)
>  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/