如果我有:
config/initializers/foobar.rb
有:
$foos = User.where(:foo => true).pluck(:id)
在我的应用程序中,当我调用$foo
时,它是否每次都会点击数据库?
或者$foo
仅在服务器启动时命中数据库吗?
答案 0 :(得分:3)
您正在存储范围(即一组标准)。但是,该范围将缓存它已加载的内容,因此(例如)$foos.each {|user| ...}
只会在首次使用时(而不是在分配时)执行一次查询。
某些操作总是会触发查询,例如$foos.count
将始终执行select count(*)...
,其他操作将取决于是否已加载范围。
最后,对该范围的进一步改进也会影响数据库,例如
$foos.order('blah').first
每次使用时都会触发一个新查询。应该很容易看出这是否正在发生,尽管在irb中测试时要小心:irb调用检查表达式的结果,这会导致范围被加载。
答案 1 :(得分:0)
$foos
只是一个变量,因此只有在分配数据库时它才会命中。