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