0

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?も、すべてのプログラム レコードを同じようにロードするように振る舞うべきではありませんか?

4

1 に答える 1