如何在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查询。
- Rails ActiveRecord:是否可以组合:include和:conditions查询?
- Rails ActiveRecord Eager Load需要很长时间
- 如何在具有名为“valid”的列的数据库上使用ActiveRecord? (DangerousAttributeError)
- ActiveRecord的:: StatementInvalid。 PG错误
- ActiveRecord对子集或记录的计算
- 如何在activerecord之外创建activerecord样式validation?
- Rails将params / arguments传递给ActiveRecord回调函数
- Rails 3.2中具有ActiveRecord关联的无表模型
- rails ActiveRecord在控制台中找到