微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 在Rails中缓存Twitter API调用

我的项目实现了“使用Twitter登录”OAuth舞蹈,并呈现一个页面,显示当前用户所遵循的所有用户.
# /views/user/show.html.erb

<h1>Users You Follow</h1>

<%= render :partial => 'followed_user',:collection => @current_user.following %>

以下是Users模型的虚拟属性.

# /users/models/user.rb

def following
  result = twitter_request_authenticated('get_following')
  parse_body(result)
end

首先,因为我是Rails(和MVC)的新手,我不得不问:这是一个合适的抽象吗?这些’跟随用户’本身应该被建模吗?

而现在真正的问题是:

在每个页面加载上点击Twitter获取此信息似乎是不必要的.如果我们想在给定的时间段内缓存此类API调用的结果(并使方法可用于方便地刷新该缓存),那么我们该怎么做呢?这只是将API调用的返回值存储在数据库列中的问题,以及“到期”列,并且仅在该列值为空或者cache_expires<时才调用API.现在?如果是这样,那听起来可能更好地位于自己的模型中.思考?

解决方法

如果您希望缓存在一定时间后过期,您可能希望使用Memcached. Memcached允许您指定缓存的到期时间.将Rails配置为使用Memcached作为认缓存解决方案后,您可以执行以下操作:
def following
  Rails.cache.fetch("following/#{id}",:expires_in => 1.hour) do
    result = twitter_request_authenticated('get_following')
    parse_body(result)
  end
end

这将在内存中缓存以下列表1小时,缓存对每个用户都是唯一的.然后,您可以使用此命令在任何时候手动使此缓存过期:

Rails.cache.delete("following/#{id}") # where id is the user's id

要开始使用Ruby on Rails缓存,请查看this指南.

P.S:我认为你没有为每个用户建模current_user所遵循的方法是完全没问题的.如果你想对这些用户执行一整套操作,那么为TwitterUser创建一个单独的模型可能是值得的,但我不会合并User和TwitterUser,因为它们可能完全不同.例如,随机的TwitterUser可能没有您系统中的授权,并且可能因为系统的用户正在关注它们而无法登录.

原文地址:https://www.jb51.cc/ruby/265174.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐