2012-10-23 44 views
0

我正在尋找一種方法來存儲在更新或創建操作中生成的SQL字符串。我試過在update_attributes的末尾嘗試追加.to_sql,但它會返回TrueClass錯誤(或類似的內容)。有什麼我失蹤了嗎?to_sql不工作update_attributes或.save

+0

我不認爲這有可能是因爲我不的事情,因爲AREL從來就更新/刪除邏輯糾正我,如果我錯了 – Viren

+0

你爲什麼試圖將SQL存儲在數據庫中? –

+0

因此,我稍後可以將其作爲API端點引用,以返回在「x」日期之間運行的所有查詢,然後讓這些查詢在使用sqlite(主數據庫爲mysql)的移動應用程序上運行。基本上是一種將移動應用程序與mysql數據庫中的內容同步的方法。 –

回答

1

這些方法都返回一個布爾值。你不能在布爾值上調用to_sql

+0

這就是我的想法。有什麼辦法可以捕獲執行的sql嗎?顯然它會在日誌文件中得到輸出,但我正在執行時將字符串存儲在數據庫中。 –

1

簡而言之 - 您需要重寫ActiveRecord執行方法。在那裏你可以添加任何用於記錄的邏輯。

connection = ActiveRecord::Base.connection 
class << connection 
    alias :original_exec :execute 
    def execute(sql, *name) 
    # try to log sql command but ignore any errors that occur in this block 
    # we log before executing, in case the execution raises an error 
    begin 
     file = File.open(RAILS_ROOT + "/log/sql.txt",'a'){|f| f.puts Time.now.to_s+": "+sql} 
    rescue Exception => e 
     ; 
    end 
    # execute original statement 
    original_exec(sql, *name) 
    end 
end 

學分:

https://stackoverflow.com/a/1629474/643500

https://stackoverflow.com/a/1640560/643500

+0

就像這個人在原帖中說的那樣,你會把這個放在哪裏? –

+0

你可以把它放在任何你喜歡的地方,真的。就我個人而言,我認爲它的初始化是有道理的,但這是一個品味問題。 – MrTheWalrus

+0

感謝您的回覆。假設我將它放入初始化程序中,我將如何「調用」它以便可以記錄查詢?上面的代碼對我來說意味着每次都會運行。我期望在許多控制器中的某些操作上運行這樣的方法。 –