基于密钥的缓存过期与Mongoid嵌入式文档

时间:2012-08-27 18:30:04

标签: ruby-on-rails-3 caching mongoid

如何使用嵌入式文档设置基于密钥的缓存过期的俄罗斯玩偶? 如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

2 个答案:

答案 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