私が持っている場合:
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| ...}
最初に使用した時点で (割り当て時ではなく) クエリを 1 回だけ実行します。
ただし、一部の操作は常にクエリをトリガーします。たとえば、常に a$foos.count
を実行select count(*)...
し、スコープがロードされているかどうかに依存する操作もあります。
最後に、そのスコープのさらなる改良もデータベースにヒットします。たとえば、
$foos.order('blah').first
使用されるたびに新しいクエリがトリガーされます。これが起こっているかどうかは簡単にわかるはずですが、irb でテストするときは注意してください。irb 呼び出しは、スコープが読み込まれる原因となる式の結果を検査します。
$foos
は単なる変数であるため、割り当てられたときにのみデータベースにヒットします。