2013-02-25 1 views
0

В моей модели пользователя у меня есть метод friends, который возвращает хэш всех друзей пользователя facebook. На мой взгляд, я перебираю весь список для разбивки списка по алфавиту. Я не могу сказать, работает ли мой сервер очень медленно или если это крайне неэффективно. Как я могу сделать этот процесс быстрее? Возможно ли создать модель friends? Пожалуйста, дайте мне знать, если мой метод неэффективен, почему и как я могу сделать это быстрее. Благодаря!Итерация через get_connections («я», «друзья») ... это неэффективно?

В моем представлении 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

Вы производите внешний API-запрос для каждого запроса. Плюс у пользователя может быть большое количество друзей, таких как 500, 1000.

Я в своем приложении fb обрабатываю данные в фоновом задании (замедленное задание). Вы можете использовать resque или sidekiq или какой-либо другой фон для обработки пользовательских данных.

Я предлагаю вам создать модель Friend и установить связь с моделью пользователей. Тогда, если у вас есть проблема с n + 1-запросом, вы можете использовать includes и вместо использования sort использовать order было бы намного быстрее, чем sort. Более того, вместо использования each используйте find_each, он обработает данные в кусках, вы можете Google разницу между каждым и find_each. надеюсь, было бы полезно

0

Одна вещь, которая будет замедляя каждый запрос наверняка является тот факт, что ваш делать внешний вызов API в середине запроса. Второе, что нужно отметить, это то, что вы потенциально возвращаете большой объем данных, легко попадая в сотни, если не тысячи.

Более подходящим способом справиться с этим было бы создание модели Friend, где каждый друг имеет отношение, относящееся к отношению к Пользователю. В фоновом процессоре (т. Е. Замедленное задание, resque, sidekiq), итерации через ваших пользователей и обновление их друзей на некоторый интервал, который может терпеть ваш сервер. Это вызовет некоторое отставание в том, когда появятся друзья пользователя. Вы должны быть судьей относительно того, насколько долгое время терпимо, и во многом зависит от вашего количества пользователей и бюджета на аппаратное обеспечение.

Это эффективно механизм кэширования, и вы можете учесть, что данные будут меняться, друзья могут быть удалены и так далее. Вы можете удалить всех друзей и воссоздать весь список при каждом обновлении. Выполнение этой операции внутри транзакции будет препятствовать показу ее до ее совершения.

Смежные вопросы