2011-12-03 24 views
1

私は、ActiveResourceでAPIを使用してモデルを使用するアプリケーションを構築しています。ActiveResource + Caching

@resource ||= @resource.do a query 

が動作しない、つまりコントローラーにそのようなものを置くと、アプリケーションが引き続きAPIを照会することに気付きました。だから私はActiveRecordで慣れていたキャッシングが組み込まれていません。私の知識とスキルの基盤を広げる時間。

私はこれを見つけました:http://injectisforwizards.com/blog/read-through-caching-of-activeresource/、この100%はまだ分かりませんが、コントローラ検索のための.findはこれが機能するようです。しかし、ではない任意のカスタムクエリのために私は、たとえばいる:

私はこれを通じて働いていると私が何であるかを見つけることができます(コレクションを返す、カスタムコントローラを打つと範囲を実行します)

@current_resource ||= Resource.get(:resource_all, :by_account=>@current_account.account_key) 

ActiveResourceのようなものにするためにActiveResourceのキャッシュを円滑にするためにできること、どのようにすべてのクエリをキャッシュするためにこれを調整することができるかなど、誰かが私にもっと簡単な用語を教えてもらえるかどうか不思議です。助けてください。

編集:私はこの発見

:有望に見えるhttps://github.com/Ahsizara/cached_resourceをが、それは注目に値するが、コレクションの任意の並べ替えを処理していないようだということですが、ために....新しい(そして上記のリンクしているオフ建て)であります1つのリソースがよく見つかる/キャッシュする。

答えて

0

リクエストごとにコントローラの新しいインスタンスを受け取るので、そのようなキャッシュは機能しません。

def show 
    @resource ||= expensive_request 
end 

あなたがそのメソッドの実行時にする@resource何を期待している:私はあなたがこのような何かを持って想定していますか?以前の電話番号showからの何かの結果?起こることはありません。

要求の間に永続化したい場合は、Rails.cacheにする必要があります。 memcachedをバックエンドとして使用すると、これは非常に効率的になります。セクション2.5の詳細については、Caching with Railsガイドを参照してください。

一般に、||=キャッシングの方法よりも優れたアプローチは、結果を保存するためにmemoizeでラップされた保護されたメソッドを定義することです。例えば:

def load_resource 
    expensive_request 
end 
memoize :load_resource 

は、これは、同じ要求のコンテキスト内でそのメソッドに後続の呼び出しに適用され、Rails.cacheを使用するのと同じではないであろうことに注意してください。

+0

私の質問の後半では、私は解決策をテストしていましたが、実際には動作していないときにエラーが発生していることが判明しています。私は言及されたリンクで解決策で何が起こっているのか見て興味があります – blueblank