我正在尝试允许将其Facebook帐户连接到我的rails应用程序的用户找到已经在应用程序中注册的Facebook好友,最好采用索引格式(类似于Formspring的显示)。
目前我正在使用Devise,OAuth + Fbook Javascript SDK和Koala。我有每个用户的Facebook UID连接他们在数据库中保存的Facebook,但我不知道如何过滤Facebook API调用的结果@friends = @ graph.get_connections(“我”,“朋友”)为了显示与API调用数据具有匹配UID的用户。
有什么想法?可能还有更好的方法,所以如果需要任何其他信息,请知道。非常感谢你的帮助!
EDIT(用户控制器中索引操作的屏幕截图)
在@oauth注意,app id和app secret在示例图片中被裁剪
答案 0 :(得分:16)
如果您可以为用户的朋友获取一组UID,您可以使用IN
在一个SQL语句中找到它们(这里有一些handwaving和/或伪代码,具体取决于属性等):
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会返回一个基于字符串的Hashes数组,因此您将无法使用collect(&:id)
来获取ID。以下是我在控制台上获取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 ID,因此您可能需要查询其他字段。
答案 1 :(得分:2)
<强> [更新] 强>
Facebook的Graph API不再允许访问版本&gt; = 2.0的完整用户的好友列表。
来自API's documentation:
App好友:
/me/friends
端点不再包含完整列表 一个人的朋友。相反,它现在返回该列表 也正在使用你的应用程序的人的朋友。