Ruby と Rails は初めてなので、用語が少し違っていても許してください。
いくつかの継承されたコードの最適化に取り組んでおり、.rabl ファイルの次のような行が原因で、クエリが繰り返されるのを確認しているログを監視しています。
node(:program) { |user| (!user.programs.first.nil?) ? user.programs.first.name : '' }
user
両方ともprogram
アクティブなレコード オブジェクトです。
Rails コンソールに移動すると、問題を再現できますが、予想される動作も得られます。これは 1 つのクエリのみです。
>u = User.find(1234)
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE [...]
> (!u.programs.first.nil?) ? u.programs.first.name : ''
Program Load (0.2ms) SELECT `programs`.* FROM `programs` [...]
Program Load (0.3ms) SELECT `programs`.* FROM `programs` [...]
=> "Output"
コンソールで 3 項ステートメントを繰り返すと、常に2 つのクエリが返されることに注意してください。
次のように期待される動作を取得できます。
> newu = User.find(12345)
User Load (3.8ms) SELECT `users`.* FROM `users` WHERE [...]
> newu.programs
Program Load (0.6ms) SELECT `programs`.* FROM `programs` [...]
> (!newu.programs.first.nil?) ? newu.programs.first.name : ''
=> "Output"
三項ステートメントを繰り返しても、再クエリはまったく行われなくなりました。
問題は、なぜ呼び出しnewu.programs
によって動作が変わるのかということです。呼び出しu.programs.first.nil?
も、すべてのプログラム レコードを同じようにロードするように振る舞うべきではありませんか?