0

コントローラのモデルからコンテンツがロードされているページの一部をフラグメントキャッシュしている場合。これらのクエリもキャッシュする必要がありますか?

これは、2つの異なるタイプのデータのフラグメントとアクティブサポートキャッシングの2つのタイプのキャッシングがあることを意味しますか?

例えば。私が持つことができるビューで:

<% cache 'videos_and_photos', :expires_in => 24.hours do %>
  <div id="videos">
    <% @videos.each do |video| %>
      ...
    <% end %>
  </div>

  <div id="photos">
    <% @photos.each do |photo| %>
       ...
    <% end %>
  </div>
<% end %>

およびコントローラー内:

Rails.cache.fetch('videos', :expires_in => 24.hours) do
  @videos = Video.where(...)
end

Rails.cache.fetch('photos', :expires_in => 24.hours) do
  @photos = Photo.where(...)
end

これに関する私の唯一のグリップは、1つのキャッシュが最初に期限切れになると、データの表示に一貫性がなくなることです。これについてもっと良い方法はありますか?

4

2 に答える 2

1

通常、ビューでビジネスロジックやクエリを使用するべきではありませんが、この場合、例外を作成することができます。たとえばVideo.your_method、クエリに特別なメソッドを定義し、それをビューで使用するだけです。これはそれを行うための最もクリーンな方法のようです:

<% cache 'videos_and_photos', :expires_in => 24.hours do %>   
  <div id="videos">
    <% Video.your_method.each do |video| %>
      ...
    <% end %>   
  </div>

そうしないと、2つの異なる場所に一緒に属するデータをキャッシュすることになり、予期しない結果が生じる可能性があります。

于 2012-08-08T10:13:01.900 に答える
0

キャッシュが存在する場合にデータベースにクエリを実行する必要がないように、gemを作成しました。

https://github.com/rovermicrover/FlagpoleSitta

すべてのデータベース呼び出しをProcsに格納し、キャッシュが存在しない場合にのみ呼び出します。次に、オブジェクトが更新されると、関連するすべてのキャッシュが無効になります。私は次のstackoverflowの投稿からアイデアを得ました。

memcachedとRailsのフラグメントキャッシングとオブジェクトキャッシングを組み合わせる最良の方法

私の宝石は過剰に殺されている可能性があり、まだベータ版であると考えていましたが、上記のスタックオーバーフローポストからの全体的な戦略が役立つはずです。

于 2012-08-08T19:20:36.810 に答える