2017-04-17 76 views
0

爲了演示的目的,假設我有一個名爲DemoThing的類,其方法名爲do_somethingActiveRecord:檢查數據庫調用次數

有沒有辦法(代碼中)我可以檢查do_something到達數據庫的次數?有沒有一種方法可以在活動記錄上「窺探」來計算數據庫被調用的次數?

例如:

class DemoThing 

    def do_something 
    retVal = [] 
    5.times do |i| 
     retVal << MyActiveRecordModel.where(:id => i) 
    end 

    retVal 
    end 

end 

dt = DemoThing.new 
stuff = dt.do_something # want to assert that do_something hit the database 5 times 
+0

http://guides.rubyonrails.org/active_support_instrumentation.html – dbugger

回答

0

的ActiveRecord應登錄STDOUT每個查詢。

但是對於上面的代碼,很明顯你會爲i的每次迭代進行5次調用。

查詢可以通過不混合Ruby邏輯和查詢來提高效率。

在此示例中,在查詢之前獲取id將意味着不會爲每個Ruby循環調用該查詢。

ids = 5.times.to_a 
retVal = MyActiveRecordModel.where(id: ids) # .to_a if retVal needs to be an Array 
0

當然可以。但首先你必須瞭解Rails的查詢緩存和記錄器。默認情況下,Rails將嘗試通過打開一個簡單的查詢緩存來優化性能。它是存儲在當前線程上的一個散列(每個活動數據庫連接一個 - 大多數導入進程只有一個)。無論何時做出select語句(比如find或where等),相應的結果集都存儲在散列中,並使用SQL查詢它們作爲鍵。您會注意到,當您運行上述方法時,您的日誌將顯示Model Load聲明,然後顯示CACHE聲明。您的數據庫只被查詢一次,其他4個通過緩存加載。在運行該查詢時觀察服務器日誌。