Фильтрация массива на основе записей базы данных - PullRequest
1 голос
/ 02 марта 2012

У меня есть 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 для каждого друга в списке, что заметно неэффективно.

Есть ли более эффективные средствафильтрации этого списка на основе записей базы данных?

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Вероятно, самый простой способ сделать это - передать массив в метод where в ruby.Если вы передадите массив, он будет преобразован в 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'])}

Обратите внимание, что вышеприведенное довольно неэффективно, если у вас есть приличное количество записей в любом массиве.Возможно, вам захочется его оптимизировать, или, что еще лучше, не использовать массив друзей и просто перебирать записи пользователя, если они содержат одинаковые данные.

0 голосов
/ 02 марта 2012

Вы можете использовать запрос SQL IN, чтобы выбрать все идентификаторы одновременно.

friend_ids = friends.map{|f| f['id']}
User.scoped(:conditions => ['id IN (?)', friend_ids])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...