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

时间:2009-07-07 07:17:33

标签: ruby-on-rails ruby activerecord

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

$this->db->last_query();

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

3 个答案:

答案 0 :(得分:24)

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 # => ...

答案 1 :(得分:3)

可能是因为我有一个较新版本的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 # => ...

答案 2 :(得分:0)

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