2

以下の引用を引用しましたが、これにはある程度の意味があります。

「キャッシュされたページとフラグメントは通常、モデルの状態に依存します。キャッシュは、どのアクションが関連するモデルを作成、変更、または破棄するかを気にしません。そのため、通常のオブザーバーを使用することは、キャッシュを期限切れにするための最良の選択のようです。」

例えば。モデルを更新する resque ワーカーがあります。モデルが更新/作成されたときに有効期限が切れるフラグメント キャッシュが必要です。これは掃除機ではできません。

ただし、オブザーバーを使用すると、モデルまたは Resque ジョブで次のようなものが必要になります。

ActionController::Base.new.expire_fragment('foobar')

モデル自体はキャッシングについて認識すべきではありません。これは、MVCの原則を破り、将来的に醜い結果につながります。

4

4 に答える 4

3

ActiveRecord :: Observerを使用して、モデルの変更を監視します。キャッシュを期限切れにする可能性があります。

于 2012-05-10T01:29:54.020 に答える
3

ビューテンプレートでモデルを引数として渡すことにより、キャッシュを自動期限切れにすることができます。

<% cache @model do %>
  # your code here
<% end %>

舞台裏で起こっているのは、[model]/[id]という名前のキャッシュです-[updated_at]が作成されます。cache_keyモデルには、モデルIDとupdated_atタイムスタンプを含む文字列を返すメソッドがあります。モデルが変更されると、フラグメントのupdated_atタイムスタンプが一致せず、キャッシュが再生成されます。

これははるかに優れたアプローチであり、バックグラウンドワーカーや、コントローラー/オブザーバーのキャッシュの期限切れについて心配する必要はありません。

Ryan Batesは、トピックに関する有料のRailscastも持っています:フラグメントキャッシング

于 2012-05-26T01:55:12.013 に答える
2

適切で簡単な解決策は、期限切れにならず、コンテンツが異なる場合に異なるキーでキャッシュすることです。ここに例があります

<% cache "post-#{@post.id}", @post.updated_at.to_i do %>

その投稿が更新または削除されて再度フェッチすると、ハッシュが異なるためキャッシュが失われ、有効期限が切れて新しい値がキャッシュされます。これを行うことでいくつかの問題が発生する可能性があると思います。たとえば、htmlファイルをキャッシュとして作成するRailsのデフォルトキャッシュを使用している場合、しばらくするとパブリックディレクトリに多くのファイルが作成されるため、設定することをお勧めしますアプリケーションで memcached のようなものを使用して、メモリを管理し、古いキャッシュされたレコード/ページ/パーシャルを削除して、他のものやそのようなものをキャッシュする必要がある場合。

于 2012-05-10T02:58:08.893 に答える
0

Rails Guide - Caching with Rails: An overviewsweepersのこのセクションを確認することをお勧めします。

http://guides.rubyonrails.org/caching_with_rails.html#sweepers

これは、多くのキャッシュ有効期限オブザーバーを特に作成しなくても実行できるようです。

于 2012-05-10T02:34:31.843 に答える