如何使用嵌入式文档设置基于密钥的缓存过期的俄罗斯玩偶? 如37 signals
所述我相信在Mongoid 3.0中为touch
添加了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 :(得分: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
答案 1 :(得分: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