我正在尋找像CodeIgniter的:如何獲取Ruby on Rails中ActiveRecord執行的最後一個SQL查詢?
$this->db->last_query();
(http://codeigniter.com/user_guide/database/helpers.html)
我正在尋找像CodeIgniter的:如何獲取Ruby on Rails中ActiveRecord執行的最後一個SQL查詢?
$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 # => ...
對於修補猴子補丁之王Rails的一部分的猴子來說,+1。 – 2009-11-09 15:42:02
您的開發日誌應包括所運行的所有SQL查詢。
可能是因爲我有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 # => ...
你到底想幹什麼?我不認爲這很簡單 - 你可能不得不在某處修改ActiveRecord。我也擔心這樣的行爲會打破(不可否認的)抽象。可能有更好的,更有利於Rails的方式來實現你想做的事情。 – 2009-07-07 07:57:11
我想在Rails/ActiveRecord日誌級別設置得很低的情況下記錄查詢,所以我只能看到我真正感興趣的查詢。 – 2009-07-07 08:51:40