2

Rails 3 のサイト全体でいくつかのリクエストで再利用される高価なクエリをキャッシュしようとしています。

ユーザーがレポートを表示するためにテーブルをクリックするか、マップを表示するためにクリックするか、ユーザーが何かを印刷するためにクリックすると、次のクエリが実行されます。

reports.where{(time > my{range.begin}) & (time < my{range.end})}

これは、何千ものレコードになる可能性がある高価なクエリです。私はそれをキャッシュしたいので、最初に呼び出された後、クエリ内のレコードの 1 つが変更 (更新など) されるまでキャッシュに保存されます。

クエリを次のように置き換えます。

Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})} }

ただし、例外が発生します。

TypeError (can't dump anonymous class #<Module:0x007f8f92fbd2f8>):

質問の一部として、Rails.cache.fetch を使用するために config/environments/production.rb に以下を追加する必要があるかどうかを知りたいです。

config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com" //obviously I would use my ip
4

1 に答える 1

6

Arel リレーションをキャッシュ ストアにダンプしようとしていますが、残念ながらそれはできません。結果の配列をダンプしたいので、代わりにこれを行います:

Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})}.all }

...また...

Rails.cache.fetch('time_reports') { reports.where{(time > my{range.begin}) & (time < my{range.end})}.to_a }

これにより、関係が実際の配列になり、通常どおり memcached に保存できます。

于 2013-03-15T23:23:46.220 に答える