2009-07-07 87 views
7

我正在尋找像CodeIgniter的:如何獲取Ruby on Rails中ActiveRecord執行的最後一個SQL查詢?

$this->db->last_query(); 

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

+0

你到底想幹什麼?我不認爲這很簡單 - 你可能不得不在某處修改ActiveRecord。我也擔心這樣的行爲會打破(不可否認的)抽象。可能有更好的,更有利於Rails的方式來實現你想做的事情。 – 2009-07-07 07:57:11

+0

我想在Rails/ActiveRecord日誌級別設置得很低的情況下記錄查詢,所以我只能看到我真正感興趣的查詢。 – 2009-07-07 08:51:40

回答

23

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

對於修補猴子補丁之王Rails的一部分的猴子來說,+1。 – 2009-11-09 15:42:02

0

您的開發日誌應包括所運行的所有SQL查詢。

2

可能是因爲我有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 # => ... 
相關問題