Сравнение одного массива с другим в рельсах - PullRequest
0 голосов
/ 29 августа 2010

Я использую драгоценный камень «контакты» в рельсах, чтобы получить контакты пользователей из своего почтового приложения. Возвращает контакты вот так:

["person name", "personemail@example.com"], ["person name", "personemail@example.com"], ["person name", "personemail@example.com"] etc...

Я хочу сравнить этот список с пользователями, которые уже зарегистрировались для моего сайта

Users.find (: все) возвращает:

[#<User id: 11, login: "examplelogin", email: "example@example.com">, #<User id: 12, login: "examplelogin", email: "example@example.com">, etc... ]

Как лучше всего сравнивать электронные письма с контактами Gmail с электронными письмами пользователей и отображать только совпадающие?

Я думал что-то вроде:

@contacts = Contacts::Gmail[params[:from]].new(params[:login], params[:password]).contacts
@contacts.each do |c|
  @email = c[1]
  @user = Users.find_by_email(@email)
end

Который предположительно вернет пользователей только там, где было совпадение. Я чувствую, что должен быть лучший способ сделать это, который я не рассматриваю. Есть предложения?

1 Ответ

2 голосов
/ 29 августа 2010
@users = Users.find_all_by_email(@contacts.collect{|contact| contact[1]})

редактирование:

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

where 'users'.'email' in array_of_email_addresses. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...