2012-11-08 47 views
2

如果我有:這是否每次都打db?

config/initializers/foobar.rb 

其中有:

$foos = User.where(:foo => true).pluck(:id) 

在我的應用程序時,我打電話$foo,不是擊中分貝每次?

還是$foo只能在服務器啓動時碰到db?

回答

3

您正在存儲範圍(即一組標準)。但是,該範圍將緩存它已加載的內容,因此(例如)$foos.each {|user| ...}只會在第一次使用時執行一次查詢(而不是在分配時)。

某些操作將始終觸發查詢,例如$foos.count將始終執行select count(*)...,而其他操作將取決於範圍是否已加載。

最後,在該範圍內進一步改進也將達到分貝,例如

$foos.order('blah').first 

它每次使用時都會觸發一個新的查詢。應該很容易看到是否發生這種情況,但在irb中進行測試時要小心:irb調用檢查導致範圍被加載的表達式結果。

0

$foos只是一個變量,所以它只會在分配數據庫時觸發數據庫。

相關問題