在我的用户模型中,我有一个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
答案 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之间的差异。希望它会有所帮助