2012-08-27 5 views
1

임베디드 문서로 키 기반 캐시 만료와 같은 러시아 인형을 어떻게 설정합니까?Mongoid 임베디드 문서로 키 기반 캐시 만료

37 signals에 의해 설명 된 바와 같이 나는 touch이 Mongoid 3.0 belongs_to 추가되었다 생각하지만 당신은 포함 된 문서를 함께 어떻게 다룰 것인가?

예 클래스 :

class House 
    embeds_many :persons 
end 

class Person 
    embedded_in :house 
end 

보기 :

<% cache ['v1', house] do %> 
    <%= house.some_attribute %> 
    <% house.persons.each |person| %> 
    <% cache ['v1' person] do %> 
     <%= render 'houses/person', person: person %> 
    <% end %> 
    <% end %> 
<% end %>  

것은 무엇 감동을 일반화하는 가장 간단한 방법이 될 것이다? 그래서 내가 사람을 업데이트 할 때, 그 사람이 끼워 넣은 집에 손이 닿게됩니다.

편집 : 여기에 포함 된 모든 항목을 다시 렌더링하는 것이 상대적으로 저렴할까요? 물론이 작업을 수행 할 수 있습니다.

class Person 
    after_save :touch_house 
    def touch_house 
    house.touch 
    end 
end 

답변

0

나는 임베디드 터치를 옵저버와 데이지 체인 방식으로 구현합니다.

class PersonObserver < Mongoid::Observer 
    def sweep(person) 
    person.house.touch 
    end 

    alias_method :after_update, :sweep 
    alias_method :after_create, :sweep 
end 

사람을 업데이트하거나 생성하면 해당 사람의 집에 접촉하여 주택의 update_at 타임 스탬프를 효과적으로 업데이트합니다. 관찰자를 사용하여 application.rb이를 추가하기 위해

: 내가 포함 된 모델에 포함

module ParentTouchable 

    extend ActiveSupport::Concern 

    def touch_parent 
    self._parent.touch 
    end 

end 

하고, 그래서 할 수 있습니다

config.mongoid.observers = :person_observer 
+0

감사합니다. 유일한 문제는> 3 개의 임베디드 문서의 깊이에 다소 지저분해진다는 것입니다. – Yeggeps

0

나는이 문제를 정의 after_save 콜백에서 touch_parent를 호출하십시오. 내 내장 모델이 댓글이라고 가정 해 보겠습니다. 댓글 :

class Comment 

    include Mongoid::Document 
    include ParentTouchable 

    after_save :touch_parent 

end