通过get_connections(“我”,“朋友”)进行迭代......这样效率低吗?

时间:2013-02-25 05:13:33

标签: ruby-on-rails

在我的用户模型中,我有一个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

2 个答案:

答案 0 :(得分:0)

要确保每个请求放慢速度的一件事是您在请求中间进行外部API调用。需要注意的第二件事是,您可能会带回大量数据,即使不是数千,也可轻松获取数百个数据。

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

这实际上是一种缓存机制,您可能想要考虑到数据会发生变化,朋友可能会被删除等等这一事实。您可以删除所有朋友,并在每次刷新时重新创建整个列表。在事务中执行此操作将使删除在提交之前不会显示。

答案 1 :(得分:0)

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

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

我建议你制作一个朋友模型,并将其与用户模型联系起来。然后,如果您有一些n + 1查询问题,则可以使用includes而不是使用sort使用order,它会比sort快得多。此外,它不是使用each使用find_each,而是以块的形式处理数据,您可以谷歌查看每个和find_each之间的差异。希望它会有所帮助