【发布时间】: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