2

私が持っている場合:

config/initializers/foobar.rb 

これは:

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

私のアプリで電話をかけると$foo、毎回データベースにヒットしますか?

または$foo、サーバーの起動時にデータベースにヒットするだけですか?

4

2 に答える 2

3

スコープ(つまり、一連の基準)を保存しています。ただし、そのスコープはロードしたものをキャッシュするため、(たとえば)$foos.each {|user| ...}最初に使用した時点で (割り当て時ではなく) クエリを 1 回だけ実行します。

ただし、一部の操作は常にクエリをトリガーします。たとえば、常に a$foos.countを実行select count(*)...し、スコープがロードされているかどうかに依存する操作もあります。

最後に、そのスコープのさらなる改良もデータベースにヒットします。たとえば、

$foos.order('blah').first

使用されるたびに新しいクエリがトリガーされます。これが起こっているかどうかは簡単にわかるはずですが、irb でテストするときは注意してください。irb 呼び出しは、スコープが読み込まれる原因となる式の結果を検査します。

于 2012-11-08T12:18:03.770 に答える
0

$foosは単なる変数であるため、割り当てられたときにのみデータベースにヒットします。

于 2012-11-08T12:12:30.197 に答える