我正在构建一个应用程序,它通过一个带有ActiveResource的应用程序接口来使用模型。我注意到
@resource ||= @resource.do a query 不起作用,也就是说,如果我把类似的东西放到我的控制器中,我的应用程序仍然会查询api。所以没有我习惯于使用ActiveRecord的内置缓存。是时候扩展我的知识和技能基础了,好吗?
我发现了这个:http://injectisforwizards.com/blog/read-through-caching-of-activeresource/,虽然我还不能100%地理解这一点,但对于执行.find的基于控制器的查询,这似乎是有效的。但不适用于我的任何自定义查询,例如:
@current_resource ||= Resource.get(:resource_all, :by_account=>@current_account.account_key)(它命中自定义控制器并运行作用域,返回一个集合)
我正在解决这个问题,我会弄清楚发生了什么,但我很好奇是否有人能告诉我发生了什么,我可以做些什么来平滑ActiveResource中的缓存以使其更像ActiveRecord,我如何定制它来缓存所有查询,等等。
编辑:
我发现:https://github.com/Ahsizara/cached_resource看起来很有前途,但它是新的(并且是在上面的链接上构建的)....notable似乎不处理任何类型的集合,但对于一种资源来说,它可以很好地发现/缓存。
发布于 2011-12-04 04:36:15
因为您会为每个请求接收一个控制器的新实例,所以这样的缓存是不会工作的。我假设你有这样的东西:
def show
@resource ||= expensive_request
end当该方法执行时,您期望@resource是什么?上一次调用show的结果是什么?这是不可能的。
如果您希望在请求之间保持这些内容,您需要做的就是将它们放入Rails.cache中。如果您使用memcached作为后端,这将非常有效。有关2.5节的更多信息,请参阅Caching with Rails指南。
通常,比||=缓存方法更好的方法是定义用memoize包装的受保护方法来保存结果。例如:
def load_resource
expensive_request
end
memoize :load_resource请记住,这将仅适用于同一请求上下文中对该方法的后续调用,并且与使用Rails.cache不同。
https://stackoverflow.com/questions/8370514
复制相似问题