我的项目实现了“使用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可能没有您系统中的授权,并且可能因为系统的用户正在关注它们而无法登录.