2012-08-27 26 views
1

如何設置一個俄羅斯娃娃像基於密鑰的緩存到期與嵌入式文檔? 正如37 signals使用Mongoid嵌入式文檔的基於密鑰的緩存過期

描述我相信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中:

config.mongoid.observers = :person_observer 
+0

謝謝!唯一的問題是,這對於大於3個嵌入式文檔的深度會有點混亂。 – Yeggeps

0

我定義這個問題:

module ParentTouchable 

    extend ActiveSupport::Concern 

    def touch_parent 
    self._parent.touch 
    end 

end 

,然後我包括它在嵌入式模式,這樣我就可以在after_save回調中調用touch_parent。假設我的嵌入式模型是評論:

class Comment 

    include Mongoid::Document 
    include ParentTouchable 

    after_save :touch_parent 

end