2

如果我有:

config/initializers/foobar.rb 

其中有:

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

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

还是$foo只在服务器启动时点击数据库?

4

2 回答 2

3

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

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

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

$foos.order('blah').first

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

于 2012-11-08T12:18:03.770 回答
0

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

于 2012-11-08T12:12:30.197 回答