2009-07-07 6 views
7

Busco algo así como CodeIgniter de:¿Cómo obtengo la última consulta SQL realizada por ActiveRecord en Ruby on Rails?

$this->db->last_query(); 

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

+0

¿Qué estás tratando de hacer? No creo que esto sea simple, probablemente tendrías que modificar ActiveRecord en alguna parte. También me preocupa que una acción de este tipo rompa la abstracción (obviamente permeable). Puede haber una forma mejor y más amigable con Rails de lograr lo que deseas hacer. –

+0

Quería registrar consultas mientras el nivel de registro de Rails/ActiveRecord es bajo, por lo que solo vería las consultas que realmente me interesan. –

Respuesta

23

yo sepa, no hay manera fácil de acceder a la lista de consultas. Sin embargo, puede acceder fácilmente a ellos creando un registrador súper simple.

Si abre la clase ActiveRecord::ConnectionAdapters::AbstractAdapter, verá un método llamado log. Este método se invoca en cada consulta para registrar la declaración. Por defecto, registra todas las declaraciones con el registrador Rails.

Usted puede hacer algo como

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 

Ahora usted puede conseguir la consulta con

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

+1 para el parche de mono de Rails, el parche del rey de los monos. –

+1

Tuve que poner la llamada a 'alias_method_chain' después de la definición del método, de lo contrario causó el siguiente error:' core_ext/module/aliasing.rb: 32: en 'alias_method': método indefinido 'log_with_last_query' para la clase 'ActiveRecord :: ConnectionAdapters :: AbstractAdapter '(NameError) ' –

0

Su registro debe incluir el desarrollo de todas las consultas SQL que se ejecutan.

+0

Sí, pero esa es la cuestión: tiene TODAS las consultas. Solo quiero ver lo que registro explícitamente. –

2

Probablemente porque tengo una versión más reciente de ActiveRecord que cuando se me hizo esta pregunta, pero para que funcione con ActiveRecord 3.2.3 Actualicé el script de Simone Carletti: agregué el atributo adicional binds y moví la llamada a alias_method_chain debajo de la definición del método porque, de lo contrario, generará un error que indica que no puede encontrar el método.

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 

Obtener la última consulta sigue siendo el mismo:

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