如果我有:這是否每次都打db?
config/initializers/foobar.rb
其中有:
$foos = User.where(:foo => true).pluck(:id)
在我的應用程序時,我打電話$foo
,不是擊中分貝每次?
還是$foo
只能在服務器啓動時碰到db?
如果我有:這是否每次都打db?
config/initializers/foobar.rb
其中有:
$foos = User.where(:foo => true).pluck(:id)
在我的應用程序時,我打電話$foo
,不是擊中分貝每次?
還是$foo
只能在服務器啓動時碰到db?
您正在存儲範圍(即一組標準)。但是,該範圍將緩存它已加載的內容,因此(例如)$foos.each {|user| ...}
只會在第一次使用時執行一次查詢(而不是在分配時)。
某些操作將始終觸發查詢,例如$foos.count
將始終執行select count(*)...
,而其他操作將取決於範圍是否已加載。
最後,在該範圍內進一步改進也將達到分貝,例如
$foos.order('blah').first
它每次使用時都會觸發一個新的查詢。應該很容易看到是否發生這種情況,但在irb中進行測試時要小心:irb調用檢查導致範圍被加載的表達式結果。
$foos
只是一個變量,所以它只會在分配數據庫時觸發數據庫。