根据数据库记录过滤数组

时间:2012-03-02 19:47:55

标签: mysql ruby-on-rails ruby facebook activerecord

如果用户的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查询,这显然效率低下。

是否有更有效的方法根据数据库记录过滤此列表?

2 个答案:

答案 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])