在轨道中比较一个阵列与另一个阵列

时间:2010-08-29 06:41:50

标签: ruby-on-rails arrays api comparison gmail

我在rails中使用'contacts'gem来从他们的邮件应用程序中检索用户联系人。它会像这样返回联系人:

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

我想将此列表与已注册我网站的用户进行比较

Users.find(:all)返回:

[#<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 个答案:

答案 0 :(得分:2)

@users = Users.find_all_by_email(@contacts.collect{|contact| contact[1]})

编辑:

之前您所拥有的内容会为每个联系人执行查找,只留下最后一个查询的结果,无论是否为用户,具体取决于是否存在此电子邮件。这将执行一个查询并返回所有成功匹配的数组:

where 'users'.'email' in array_of_email_addresses.