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)
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)
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 per scimmia che applica una parte di Rails, il re delle patch delle scimmie. –
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) ' –
Il registro sviluppo dovrebbe includere tutte le query SQL che vengono eseguiti.
Sì, ma questa è la cosa - ha TUTTE le domande. Voglio solo vedere cosa registro esplicitamente. –
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 # => ...
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. –
Volevo registrare le query mentre il livello di registro di Rails/ActiveRecord è basso, quindi vedrei solo le query che mi interessano veramente. –