Если вы можете получить массив UID для друзей пользователя, вы можете найти их все в одном SQL-выражении, используя IN
(некоторые здесь - ручная пометка и / или псевдокод, в зависимости от атрибутов и т. Д.):
uids = @friends.collect(&:uid)
# uids is an array of Facebook UID's, say [1234, 5678, 9012]
registered_friends = User.where('fb_uid IN (?)', uids)
# "SELECT users.* FROM users WHERE (fb_uid IN (1234, 5678, 9012))"
Если ваши данные Facebook находятся в другой модели, вы можете выбрать эту модель и сделать includes
, чтобы ввести пользователя.
registered_friends = Authorizations.where(:type => 'Facebook') \
.where('fb_uid IN (?)', uids).includes(:user).collect(&:user)
[Обновить]
Похоже, что Koala возвращает массив хэшей на основе строк, поэтому вы не сможете использовать collect(&:id)
для получения идентификаторов.Вот что я использовал для получения массива идентификаторов на консоли (секретные данные замаскированы, очевидно):
pry(main)> oauth = Koala::Facebook::OAuth.new 'xxxxxxx', 'yyyyyyyyy'
=> #<Koala::Facebook::OAuth:0x00000100d03be8>
pry(main)> token = 'zzzzzzzzzz'
=> "zzzzzzzzzz"
pry(main)> graph = Koala::Facebook::GraphAPI.new token
=> #<Koala::Facebook::GraphAPI:0x00000100ce3ac8>
pry(main)> friends = graph.get_connections "me", "friends"
=> [{"name"=>"A Friend", "id"=>"An ID"}, {"name"=>"Another Friend", "id"=>"Another ID"}]
uids = friends.collect { |f| f["id"] }
=> ["An ID", "Another ID"]
Кроме того, если вы следуете соглашениям Rails, поле id
вашего Services
Таблица будет основным ключом записи, а не идентификатором Facebook пользователя службы, поэтому вам может потребоваться выполнить запрос в другом поле.