如何在Ruby on Rails中获取ActiveRecord执行的最后一个SQL查询?

我正在寻找类似CodeIgniter的东西:

$this->db->last_query(); 

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

AFAIK,没有简单的方法来访问查询列表。 尽管如此,您可以轻松访问它们,创建一个超级简单的记录器。

如果您打开ActiveRecord::ConnectionAdapters::AbstractAdapter您将看到一个名为log的方法。 在每个查询上调用此方法以记录该语句。 默认情况下,它使用Rails记录器记录所有语句。

你可以做点什么

 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 

现在您可以使用

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

可能是因为我有一个较新版本的ActiveRecord而不是问这个问题,但为了让它与ActiveRecord 3.2.3一起工作我更新了Simone Carletti的脚本:我添加了额外的属性binds并将调用移动到方法下面的alias_method_chain定义,因为否则会引发一个错误,说它无法找到该方法。

 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 

获取最后一个查询仍然是相同的:

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

您的开发日志应包括所有运行的SQL查询。