首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveResource +缓存

ActiveResource +缓存
EN

Stack Overflow用户
提问于 2011-12-04 03:54:25
回答 1查看 1.2K关注 0票数 1

我正在构建一个应用程序,它通过一个带有ActiveResource的应用程序接口来使用模型。我注意到

代码语言:javascript
复制
@resource ||= @resource.do a query 

不起作用,也就是说,如果我把类似的东西放到我的控制器中,我的应用程序仍然会查询api。所以没有我习惯于使用ActiveRecord的内置缓存。是时候扩展我的知识和技能基础了,好吗?

我发现了这个:http://injectisforwizards.com/blog/read-through-caching-of-activeresource/,虽然我还不能100%地理解这一点,但对于执行.find的基于控制器的查询,这似乎是有效的。但不适用于我的任何自定义查询,例如:

代码语言:javascript
复制
@current_resource ||= Resource.get(:resource_all, :by_account=>@current_account.account_key)

(它命中自定义控制器并运行作用域,返回一个集合)

我正在解决这个问题,我会弄清楚发生了什么,但我很好奇是否有人能告诉我发生了什么,我可以做些什么来平滑ActiveResource中的缓存以使其更像ActiveRecord,我如何定制它来缓存所有查询,等等。

编辑:

我发现:https://github.com/Ahsizara/cached_resource看起来很有前途,但它是新的(并且是在上面的链接上构建的)....notable似乎不处理任何类型的集合,但对于一种资源来说,它可以很好地发现/缓存。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-04 04:36:15

因为您会为每个请求接收一个控制器的新实例,所以这样的缓存是不会工作的。我假设你有这样的东西:

代码语言:javascript
复制
def show
  @resource ||= expensive_request
end

当该方法执行时,您期望@resource是什么?上一次调用show的结果是什么?这是不可能的。

如果您希望在请求之间保持这些内容,您需要做的就是将它们放入Rails.cache中。如果您使用memcached作为后端,这将非常有效。有关2.5节的更多信息,请参阅Caching with Rails指南。

通常,比||=缓存方法更好的方法是定义用memoize包装的受保护方法来保存结果。例如:

代码语言:javascript
复制
def load_resource
  expensive_request
end
memoize :load_resource

请记住,这将仅适用于同一请求上下文中对该方法的后续调用,并且与使用Rails.cache不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8370514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档