0

在我的用户模型中,我有一个friends方法可以返回所有用户的 facebook 好友的哈希值。在我看来,我遍历整个列表以按字母顺序对该列表进行分页。我不知道我的服务器是否运行得很慢,或者这是否效率极低。我怎样才能使这个过程更快?friends创建一个模型会更好吗?如果我的方法效率低下,请告诉我,原因,以及我如何能够使其更快。谢谢!

在我的 Home.html.erb 视图中<%letter ='a'%>,当用户选择不同的字母并且页面刷新时,我有哪些变化。

<% current_user.friends.each do |user| %>
    <% if user['name'].downcase.start_with? letter %>
       do something
<% end %> 

用户模型

def facebook
    @facebook ||= Koala::Facebook::API.new(token)
    block_given? ? yield(@facebook) : @facebook
rescue Koala::Facebook::APIError => e
    logger.info e.to_s
    nil
end

def friends
    facebook {|fb| fb.get_connections("me","friends")}.sort{|a,b| a['name']<=>b['name']}
end
4

2 回答 2

0

肯定会减慢每个请求的一件事是,您在请求中间进行了外部 API 调用。第二要注意的是,您可能会带回大量数据,很容易达到数百甚至数千。

处理这个问题的更合适的方法是创建一个朋友模型,其中每个朋友都与用户有归属关系。在后台处理器(即延迟作业、resque、sidekiq)中,遍历您的用户并以您的服务器可以容忍的某个时间间隔更新他们的朋友。这将导致用户的朋友何时出现的延迟。您必须判断可以容忍多少延迟时间,这在很大程度上取决于您的用户数量和硬件预算。

这实际上是一种缓存机制,您可能需要考虑数据会更改、朋友可能会被删除等事实。您可以删除所有朋友并在每次刷新时重新创建整个列表。在事务中这样做将使删除在提交之前不会显示。

于 2013-02-25T06:11:11.770 回答
0

您正在为每个请求进行外部 API 调用。另外,用户可能有很多朋友,比如 500、1000。

我在我的 fb 应用程序中处理后台作业(延迟作业)中的数据。您可以使用 resque 或 sidekiq 或其他一些背景来处理用户数据。

我建议您制作 Friend 模型并将其与 users 模型关联。然后,如果您有一些 n+1 查询问题,您可以使用includes,而不是使用sortuseorder它会更快sort。此外,它不会使用eachusefind_each来处理块中的数据,您可以用谷歌搜索 each 和 find_each 之间的差异。希望它会有所帮助

于 2013-02-25T07:31:31.727 回答