2016-03-23 6 views
0

Rails 4.2.6のhamlに次のスニペットがあります。そこでは、レコードがいっぱいになってから翌日に移動します。ロシアのドールキャッシングを使用して、300個のチケットをレンダリングするページの読み込みを高速化したいのですが、コレクションのキャッシュキーを作成する方法がわかりません。Railsでロシア人形を使ってコレクションをキャッシュする方法は?

キャッシュキー@tickets.where(calendar_date: day).order(:calendar_order)

次に、個々のチケットをキャッシュする必要があります。私がここで助けを求める時には、私はちょっと混乱していると考えてください。だから私の質問が不明な場合は、それが必要かどうかを明確にさせてください。

day変数は、コード内で先にインクリメントされることに注意してください。

.row(data-row-date="#{ day }") 
    - @tickets.where(calendar_date: day).order(:calendar_order).each do |t| 
    - cache(t) do 
     # code for each job ticket 

UPDATE

次のコードは、私の以前の試みよりも良い作品が、私はキーが正常に期限切れとなるかどうか、それは正確だかはわかりません。

.row(data-row-date="#{ day }") 
    - tickets = @tickets.where(calendar_date: day).order(:calendar_order) 
    - cache(["day-#{day}", tickets.map(&:id), tickets.maximum(:updated_at)]) do 
    - tickets.each do |t| 
     - cache(t) do 

正しい軌道にいるかどうか教えてください。親切にありがとう。

答えて

1

「ロシア人形キャッシング」は通常、古い入れ子型リソースが自動的に親ソースのキャッシュを無効にするときのキャッシュの種類を意味します(チケット情報が更新されるとuserダイジェストがticketダイジェストと古くなってしまいます)。

私はあなたが(それはモデル関係のためtouch: trueを設定するには、もう少し努力が必要であろう)以降のネストのいくつかのレベルを追加しようとしているかどうかわからないんだけど、今のところ、それは私にはかなり細かいようだ:

  1. 各チケットがキャッシュされます(Railsはオブジェクトに基づいてmd5を作成します)t;
  2. 同じ日のチケットをリクエストしても結果セットが変更されない限り、(1)の代わりにキャッシュされたブロック全体が表示されます。

は、私が想像することができる問題のカップルが含まれます:

  1. 異なるタイムゾーンを。 calendar_dateが実際にDateである場合、世界各地のユーザーは、サーバーベースのものではなく、実際の日付に基づいて結果を得ることができます。
  2. update_allを使用している場合、ActiveRecordはタイムスタンプフィールド(updated_at/updated_on)を更新しません。 Ticket.update_all(params)のようなことに注意してください。キャッシュダイジェストは無効になりません。
+0

私はそれぞれの「日」にネストされたキャッシュを作成します。これまでのところ、heroku redisについて約2Mbほどうまくいっているようです。ありがとうございました。 – tidelake

+0

日付はDateオブジェクトであり、アプリケーションはDallasの1つのオフィスグループ用であるため、異なるタイムゾーンは必要ありません。私はどこにでも 'update_all'を使っているとは思っていません。私はそれを念頭に置いています。ありがとうございました。 – tidelake

関連する問題