如果用户的Facebook好友列表如下,我有一个Array
:
[
{ 'name' => 'John Mallock', 'id' => '123123' },
{ 'name' => 'Susan Freely', 'id' => '123123123' },
...
]
我想为我的Rails应用程序中users
表中存在的条目筛选此列表。我目前正在这样做:
graph = Koala::Facebook::API.new 'access_token'
friends = graph.get_connections 'me', 'friends' # Returns the structure above
friends.select! { |f| User.exists? :facebook_id => f['id'] }
这导致对列表中的每个朋友进行SELECT
查询,这显然效率低下。
是否有更有效的方法根据数据库记录过滤此列表?
答案 0 :(得分:2)
执行此操作的最简单方法可能是将数组传递给ruby中的where
方法。如果传入一个数组,它将被转换为数据库中的IN
查询:
users = User.where(:facebook_id => friends.map{|f| f['id']})
# generates: SELECT * FROM users where users.facebook_id IN (f1, f2, etc..)
如果您需要知道friends
中哪些条目与用户对应,您可以调用朋友选择:
existing_facebook_ids = users.map(&:facebook_id)
friends.select! {|f| existing_facebook_ids.include?(f['id'])}
请注意,如果您在任一阵列中都有相当数量的记录,则上述效率非常低。你可能想要稍微优化它,或者更好的是,不要使用friends数组,只要迭代用户记录,如果它们包含相同的数据。
答案 1 :(得分:0)
您可以使用SQL IN
查询一次选择所有ID。
friend_ids = friends.map{|f| f['id']}
User.scoped(:conditions => ['id IN (?)', friend_ids])