2011-12-08 15 views
0

これは私のデータ構造です。mongodbでの親クラスのキャッシュ

Foo 
    has_many: bar 

Bar 
    belongs_to: Foo 

Barのキャッシング方法を記述しようとしていますが、「機能」エントリのみが引き出されます。

def self.get_featured 
    Rails.cache.fetch("featured", :expires_in => 1.day) do 
    self.where(:featured=>true) 
    end 
end 

これは機能します。ただし、このデータを表示するビューでは、.get_featuredメソッドの一部としてキャッシュされない featured.foo.titleなどの情報も必要です。

私はそのようなものを呼び出すたびに、dbは再びヒットします。これはページあたり40回以上発生するため、dbが少し壊れてしまいます。

質問このバーのフィルタリングされたすべてのレコードに対して、フィルタされたバーAND Foo情報をキャッシュするにはどうすればよいですか?

答えて

2

mongoid includesを使用すると、リレーション名を指定してデータを積極的に読み込むことができます。しかし、現在は1レベルの深さに制限されています。だから、私はそれが機能していると一緒にfooをロードすることを熱望すると思うが、バーについては確信していない。あなたはそれを動作させるためにはそれを自分

def self.get_featured 
    Rails.cache.fetch("featured", :expires_in => 1.day) do 
    self.includes(:foo,:bar).where(:featured=>true) 
    end 
end 

を試すことができ、Mongoidのアイデンティティ・マップは、私はそれを試してみるよこの

identity_map_enabled: true 
+0

ようmongoid.ymlで有効にする必要があります。ありがとうございました! – Kirill

+0

これはそれ自体では機能しているようですが、私が設定した方法ではうまくいかないのです。このメソッドは、データを '@featured'変数にプルしてから、部分的に:collection => '@featured'を使ってレンダリングすることになっていました。 しかし、私はしようとすると、凍ったオブジェクトのエラーを修正することはできません。 私はこれらのオブジェクトにキャッシュを表示しているからです。別のアプローチを試みます。 – Kirill

関連する問題