2012-03-02 87 views
1

我有一個Array的數組,如果用戶的Facebook好友列表如下:過濾基於數據庫記錄

[ 
    { 'name' => 'John Mallock', 'id' => '123123' }, 
    { 'name' => 'Susan Freely', 'id' => '123123123' }, 
    ... 
] 

我想過濾此列表中存在的users表在我的Rails應用程序條目。目前,我正在做這個如下:

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

建立一個所有ID的數組,並一次檢查它們。然後,您將擁有一組用戶以及現有ID的數組。從這一點,你只是過濾。 (作爲評論發佈,因爲我不知道Ruby或FB API,所以我希望我沒有忽略任何東西。) – Corbin 2012-03-02 19:51:29

回答

2

可能做到這一點的最簡單的方式是一個數組傳遞到在一個紅寶石方法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數組,而只是在包含相同數據的用戶記錄上進行迭代。

+0

我同意它效率低下,但它會暫時工作。謝謝您的幫助。這使我的查詢從1 /朋友減少到1。 :) – 2012-03-02 20:29:04

0

您可以使用SQL IN查詢一次選擇所有ID。

friend_ids = friends.map{|f| f['id']} 
User.scoped(:conditions => ['id IN (?)', friend_ids])