2

Rails 4 アプリでキャッシングを開始しようとしていますが、キャッシュ キー設定、キャッシュ ヘルパー、および自動有効期限のバージョンが異なるため、少し混乱しています。

では、いくつかの例を挙げて質問させてください。例を意図的に別の質問に移動することはありません。これにより、誰でも一目で微妙な違いを理解できるようになると思います。

1: サイドバーの最新ユーザー

最新のユーザーを表示したい。もちろん、これはアプリ内のすべてのユーザーに同じであり、すべてのページに表示されます。railscastsexpire_fragment...で、コントローラーを呼び出して期限切れになった同様の例を見ました。ただし、他のリソースによると、これは何かが変更されると自動的に期限切れになるはずです (たとえば、新しいユーザー登録)。私の質問: キーを適切に設定していますか? 自動期限切れになりますか?

_sidebar.html.erb (サイドバーの全ページに表示)

<% cache 'latest-users' %>
  <%= render 'users/user_sidebar' %>
<% end %>

_users_sidebar.html.erb

<% @profiles_sidebar.each do |profile| %>
  <%= profile.full_name %>
  ........
<% end %>

2: 製品ショーページ

特定の商品を表示したい (ショーページのみ)。これもすべてのユーザーで同じですが、より多くの製品があるため、より多くのバージョンがあります。質問は同じです。キーを適切に設定していますか?また、キーは自動的に期限切れになりますか?

製品/show.html.erb

<% cache @product %>
  <%= @product.name.upcase %>
  <%= @product.user.full_name %>
<% end %>

3: 製品/インデックス (will-paginate gem でページ化)

ここでは、ページネーションの特定のページにあるすべての製品を一度にキャッシュして、製品がブロック単位でキャッシュされるようにします。これもすべてのユーザーに共通で、 にのみ表示されますproducts index page。(後で、このページの個々の製品に を実装したいと思いrussian-doll-cachingます。) 私の質問: これは正しく行っていますか? 自動期限切れになりますか?

製品 index.html.erb

<% cache [@products, params[:page]] %>
  <%= render @products %>
<% end %>

_product.html.erb

<%= product.name %>
<%= product.user.full_name %>
.....

私が使用しようとしたサンプルコード(それが良いものかどうかはわかりません):

最初は索引ページがあり、ロシア人形はありません。

ここに画像の説明を入力

2 つ目は、コメント付きの番組ページ用のロシア人形です。

ここに画像の説明を入力

4

2 に答える 2

2

単一のレコードをキャッシュすることと、レコードのコレクションをキャッシュすることには、かなり大きな違いがあります。

タイムスタンプを見るだけで、1 つのレコードが変更されたかどうかを簡単に判断できます。デフォルトの cache_key メソッドは次のように機能します。

Product.new.cache_key     # => "products/new" - never expires
Product.find(5).cache_key # => "products/5" (updated_at not available)
Person.find(5).cache_key  # => "people/5-20071224150000" (updated_at available)

ただし、コレクションがいつ古くなったかは、その使用方法に大きく依存します。

最初の例では、タイムスタンプのみを本当に気にしcreated_atます。他の状況では、レコードが更新されたとき、または関連するレコードが挿入/更新されたときでさえ見たいと思うかもしれません。ここに正解はありません。

1.

最初に、次の順序で N 個のユーザーをプルしますcreated_at

@noobs = User.order(created_at: :desc).limit(10)

コレクション内の最初のユーザーを調べることで、ここでキャッシュを無効にすることができます。

<!-- _sidebar.html.erb -->
<% cache(@noobs.first) do %>
  <%= render partial: 'users/profile', collection: @noobs %>
<% end %>

これを行うことができるのは、新しいユーザーが登録された場合、以前のナンバー 1 をスロットに押し下げることがわかっているからです。

次に、ロシアの人形のキャッシュを使用して、個々のユーザーをキャッシュできます。パーシャルは呼び出されるprofileため、パーシャルにはローカル変数が渡されることに注意してprofileください。

<!-- users/_profile.html.erb -->
<% cache(profile) do %>
  <%= profile.full_name %>
<% end %>

2.

はい。有効期限が切れます。他の例のように、ロシアの人形のキャッシュを部分的に使用したい場合があります。

3.

ページ分割されたコレクションの場合、配列内のレコードの ID を使用してキャッシュ キーを作成できます。

編集しました。

更新される可能性のある製品の古い表現を提供したくないためupdated_at、ロシア人形の「外側のレイヤー」でキャッシュキーとして使用することもできます。

この場合、レコードを完全にロードするのが理にかなっています。についての以前のコメントは無視してかまいません.ids

製品/index.html.erb:

<% cache([@products.map(&:id), @products.map(&:updated_at).max]) do %>
  <%= render @products %>
<% end %>

製品/_product.html.erb:

<% cache(product) do %>
  <%= product.name %>
<% end %>
于 2016-03-30T15:40:50.977 に答える