查找具有重复名称的所有用户

Mat*_*iby 14 ruby activerecord ruby-on-rails

我有拥有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
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法

jdl*_*jdl 33

通过首先找出重复数据的内容,您可以大大缩小搜索范围.例如,假设您要查找多次使用的名字和电子邮件的每个组合.

User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
Run Code Online (Sandbox Code Playgroud)

这将返回一个包含每个重复记录之一的数组.从那里,假设其中一个返回的用户有"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">]
Run Code Online (Sandbox Code Playgroud)

例如,该数组中的第一个元素显示一个用户具有"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">]
Run Code Online (Sandbox Code Playgroud)

而且您似乎还希望为代码添加一些更好的验证,以防止将来出现重复.

编辑:

如果你需要用的大铁锤find_by_sql,由于Rails 2.2和更早的版本不支持:having使用find,下面应该工作,并给你,我与上述相同的阵列.

User.find_by_sql("select * from users group by first,email having count(*) > 1")
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你的答案,但只有rails 2.3及以上,应用程序是2.2 (2认同)