2011-12-08 2 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가 약간 파열됩니다.

질문 :이 막대의 필터링 된 모든 레코드에 대해 필터링 된 막대 및 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