2009-07-07 8 views
7

Sto cercando qualcosa di simile CodeIgniter di:Come ottengo l'ultima query SQL eseguita da ActiveRecord in Ruby on Rails?

$this->db->last_query(); 

(http://codeigniter.com/user_guide/database/helpers.html)

+0

Cosa stai cercando di fare? Non penso che sia semplice - probabilmente dovresti modificare ActiveRecord da qualche parte. Sono anche preoccupato che un'azione del genere possa rompere l'astrazione (ammettiamolo). Potrebbe esserci un modo migliore, più Rails-friendly per ottenere ciò che vuoi fare. –

+0

Volevo registrare le query mentre il livello di registro di Rails/ActiveRecord è basso, quindi vedrei solo le query che mi interessano veramente. –

risposta

23

quanto ne so, non c'è un modo semplice per accedere all'elenco delle query. Tuttavia, puoi facilmente accedervi creando un logger semplicissimo.

Se apri la classe ActiveRecord::ConnectionAdapters::AbstractAdapter vedrai un metodo chiamato registro. Questo metodo è invocato su ogni query per registrare l'istruzione. Per impostazione predefinita, registra tutte le istruzioni con il registratore di Rails.

Si può fare qualcosa di simile

ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do 

    attr_reader :last_query 
    alias_method_chain :log, :last_query 

    def log_with_last_query(sql, name, &block) 
    @last_query = [sql, name] 
    log_without_last_query(sql, name, &block) 
    end 

end 

Ora è possibile ottenere la query con

ActiveRecord::Base.connection.last_query # => ... 
+1

+1 per scimmia che applica una parte di Rails, il re delle patch delle scimmie. –

+1

Ho dovuto mettere la chiamata a 'alias_method_chain' dopo la definizione del metodo, altrimenti ha causato il seguente errore:' core_ext/module/aliasing.rb: 32: in 'alias_method': metodo non definito 'log_with_last_query' per la classe 'ActiveRecord :: ConnectionAdapters :: AbstractAdapter '(NameError) ' –

0

Il registro sviluppo dovrebbe includere tutte le query SQL che vengono eseguiti.

+0

Sì, ma questa è la cosa - ha TUTTE le domande. Voglio solo vedere cosa registro esplicitamente. –

2

Probabilmente perché ho una versione più recente di ActiveRecord rispetto a quando è stata posta questa domanda, ma per farlo funzionare con ActiveRecord 3.2.3 ho aggiornato lo script di Simone Carletti: ho aggiunto l'attributo extra binds e spostato la chiamata a alias_method_chain sotto la definizione del metodo, perché altrimenti si genera un errore che dice che non riesce a trovare il metodo.

ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do 

    attr_reader :last_query 

    def log_with_last_query(sql, name, binds=[], &block) 
    @last_query = [sql, name] 
    log_without_last_query(sql, name, binds, &block) 
    end 
    alias_method_chain :log, :last_query 

end 

Ottenere l'ultima query è sempre la stessa:

ActiveRecord::Base.connection.last_query # => ...