13

フラグメント キャッシングと熱心な読み込みは、少なくとも場合によっては相反するように思えます。それぞれに多くのコメントがあり、さらに多くのコメントなどを持つことができる多くの投稿を持つユーザーがいるとしましょう。

ページをレンダリングする必要がある場合、データベースに n-1 回アクセスするのを避けるために、ユーザー、彼女のすべての投稿、すべてのコメントなどを積極的に読み込むことを選択できます。または、各オブジェクトを遅延してロードし、フラグメント キャッシュを利用して、新しいオブジェクトまたは変更されたオブジェクトのみをデータベースにクエリすることもできます。フラグメント キャッシングと熱心な読み込みの両方を使用すると、非常に複雑なクエリを実行し、多くのオブジェクトをインスタンス化してその一部のみを使用する可能性があるため、無駄に思えます。

しかし、ユーザーが多くの Foo を持ち、それがさらに多くの Bar などを持ち、各 Foo がすべての Bar とそれに関連付けられたオブジェクトで同時に完全に作成され、それ以降変更されないアプリケーションがある場合はどうなるでしょうか。 . その場合、レンダリングされた Foo にはフラグメント キャッシングを使用したいと思いますが、関連するすべてのオブジェクトとともに新しい Foo をロードする必要がある場合は熱心な読み込みを使用します。結局のところ、より細かいレベルでフラグメントをキャッシュしても何も得られません。

Railsでこれを達成するための最良の方法は何ですか? 1 つのクエリを実行して Foo の ID だけを取得し、各 Foo をレンダリングする必要があるときに熱心な読み込みで明示的な検索を実行できると思います。これを行うためのより良い/よりエレガントな/より慣用的な方法はありますか?

4

4 に答える 4

0

ラムダを使用したキャッシュで同様のことを行いました。以下でアイデアを得ることができます。それが解決する問題-最も人気のあるユーザーを獲得することは重い操作であり、5秒以上かかります。ただし、ラムダを使用すると、ユーザーのリストをキャッシュできます。

controller:
def index
 @users = -> { User.by_rating }
end

view:
= cache "rating-list", expires_in: 1.day do
  - @users.call.each do |user|
     = render user
于 2018-02-20T14:58:42.643 に答える