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

確かに各リクエストの速度を低下させる1つのことは、リクエストの途中で外部API呼び出しを行うという事実です。2つ目の注意点は、大量のデータを取り戻す可能性があり、数千とまではいかなくても数百に達する可能性があることです。

これを処理するためのより適切な方法は、各フレンドがユーザーとの関係に属しているフレンドモデルを作成することです。バックグラウンドプロセッサ(つまり、遅延ジョブ、resque、sidekiq)で、ユーザーを反復処理し、サーバーが許容できる間隔でユーザーを更新します。これにより、ユーザーの友達がいつ表示されるかについて多少の遅れが生じます。許容できるラグタイムについては、ユーザーが判断する必要があります。これは、ユーザー数とハードウェアの予算に大きく依存します。

これは事実上キャッシュメカニズムであり、データが変更されたり、友達が削除されたりする可能性があるという事実を考慮に入れることができます。すべての友達を削除して、更新のたびにリスト全体を再作成できます。トランザクション内でこれを行うと、コミットされるまで削除が表示されなくなります。

于 2013-02-25T06:11:11.770 に答える
0

リクエストごとに外部API呼び出しを行っています。さらに、ユーザーには500、1000などのかなりの数の友達がいる可能性があります。

私は自分のfbアプリでバックグラウンドジョブ(遅延ジョブ)のデータを処理しています。resque、sidekiq、またはその他のバックグラウンドを使用して、ユーザーデータを処理できます。

フレンドモデルを作成し、ユーザーモデルとの関連付けを行うことをお勧めします。次に、n + 1クエリの問題がある場合は、使用することができ、使用するincludes代わりに、それよりもはるかに高速になります。さらに、 useを使用する代わりに、データをチャンクで処理し、eachとfind_eachの違いをグーグルで検索できます。お役に立てば幸いですsortordersorteachfind_each

于 2013-02-25T07:31:31.727 に答える