【问题标题】:How can I put (parts of) a large object graph in Rails.cache?如何在 Rails.cache 中放置(部分)大型对象图?
【发布时间】:2008-11-22 19:28:43
【问题描述】:

我有一个类,其中查找实例很昂贵,所以实例被缓存:

class Foo
  def self.find(id)
    Rails.cache.fetch("Foo.#{id}") do
      // some expensive lookup, like an HTTParty request, or a long SQL query
      ...
    end
  end
end

Foos 与Foos 相关之前,这一切正常:

class Foo
  def children
    @child_foo_ids.map { |id| Foo.find(id) }
  end
end

我想使用||=缓存来节省重复行程:

class Foo
  def children
    @children ||= @child_foo_ids.map { |id| Foo.find(id) }
  end
end

但是Rails.cache 冻结了找到的Foos,所以我在创建和缓存对象后无法设置实例变量。 (即此方法引发TypeError。)

一种解决方案是在我第一次进行昂贵的查找时预取parent,但是当我只需要一个或两个实例时,这最终可能会加载一个巨大的对象图。

【问题讨论】:

    标签: ruby-on-rails ruby caching


    【解决方案1】:

    可以使用||=缓存;你只需要使用一点间接性:

    class Foo
      def initialize
        @related_objects = {}
      end
      def children
        @related_objects[:children] ||= @child_foo_ids.map { |id| Foo.find(id) }
      end
    end
    

    Rails.cache不会冻结每个Foo的实例变量,所以Hash可以被修改!

    PS:是的,我只是同时发布了这个问题和答案。我认为社区可以从我的奋斗中受益。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-13
      • 2021-10-08
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      相关资源
      最近更新 更多