我的用户有 first_name 和 last_name 字段,我需要做一个 ruby 根据名字和姓氏找到所有有重复帐户的用户。例如,我想找到一个可以搜索所有其他用户并查找是否有相同姓名和电子邮件的人。我在想这样的嵌套循环
User.all.each do |user|
//maybe another loop to search through all the users and maybe if a match occurs put that user in an array
end
有没有更好的办法
最佳答案
您可以通过首先找出重复数据的内容来大大缩小搜索范围。例如,假设您要查找多次使用的每个名字和电子邮件的组合。
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
这将返回一个包含每个重复记录之一的数组。据此,假设返回的用户之一有“Fred”和“fred@example.com”,那么您可以仅搜索具有这些值的用户以找到所有受影响的用户。
find
的返回结果如下所示。请注意,该数组仅包含每组重复用户的一条记录。
[#<User id: 3, first: "foo", last: "barney", email: "foo@example.com", created_at: "2010-12-30 17:14:43", updated_at: "2010-12-30 17:14:43">,
#<User id: 5, first: "foo1", last: "baasdasdr", email: "abc@example.com", created_at: "2010-12-30 17:20:49", updated_at: "2010-12-30 17:20:49">]
例如,该数组中的第一个元素显示一个用户使用“foo”和“foo@example.com”。其余的可以根据需要通过查找从数据库中拉出。
> User.find(:all, :conditions => {:email => "foo@example.com", :first => "foo"})
=> [#<User id: 1, first: "foo", last: "bar", email: "foo@example.com", created_at: "2010-12-30 17:14:28", updated_at: "2010-12-30 17:14:28">,
#<User id: 3, first: "foo", last: "barney", email: "foo@example.com", created_at: "2010-12-30 17:14:43", updated_at: "2010-12-30 17:14:43">]
而且您似乎还想为您的代码添加一些更好的验证以防止将来出现重复。
编辑:
如果需要使用find_by_sql
这个大锤,因为Rails 2.2及更早版本不支持:having
with find
,以下应该有效,并为您提供与我上面描述的相同的数组。
User.find_by_sql("select * from users group by first,email having count(*) > 1")
关于ruby-on-rails - 查找所有具有重复名称的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4564631/