这是每次都击中db吗?

时间:2012-11-08 12:08:09

标签: ruby-on-rails ruby ruby-on-rails-3

如果我有:

config/initializers/foobar.rb 

有:

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

在我的应用程序中,当我调用$foo时,它是否每次都会点击数据库?

或者$foo仅在服务器启动时命中数据库吗?

2 个答案:

答案 0 :(得分:3)

您正在存储范围(即一组标准)。但是,该范围将缓存它已加载的内容,因此(例如)$foos.each {|user| ...}只会在首次使用时(而不是在分配时)执行一次查询。

某些操作总是会触发查询,例如$foos.count将始终执行select count(*)...,其他操作将取决于是否已加载范围。

最后,对该范围的进一步改进也会影响数据库,例如

$foos.order('blah').first

每次使用时都会触发一个新查询。应该很容易看出这是否正在发生,尽管在irb中测试时要小心:irb调用检查表达式的结果,这会导致范围被加载。

答案 1 :(得分:0)

$foos只是一个变量,因此只有在分配数据库时它才会命中。