Usted podría ir un largo camino hacia reducir su búsqueda por descubrir lo que los datos duplicada está en el primer lugar. Por ejemplo, supongamos que desea buscar cada combinación de nombre y correo electrónico que se usa más de una vez.
User.find(:all, :group => [:first, :email], :having => "count(*) > 1")
Devolverá una matriz que contenga uno de cada uno de los registros duplicados. A partir de eso, decir que uno de los usuarios volvieron tenían "Fred" y "[email protected]" entonces se podría buscar sólo los usuarios que tienen esos valores para encontrar todos los usuarios afectados.
El regreso de find
que será algo así como lo siguiente. Tenga en cuenta que la matriz solo contiene un solo registro de cada conjunto de usuarios duplicados.
[#<User id: 3, first: "foo", last: "barney", email: "[email protected]", created_at: "2010-12-30 17:14:43", updated_at: "2010-12-30 17:14:43">,
#<User id: 5, first: "foo1", last: "baasdasdr", email: "[email protected]", created_at: "2010-12-30 17:20:49", updated_at: "2010-12-30 17:20:49">]
Por ejemplo, el primer elemento en esa matriz muestra un usuario con "foo" y "[email protected]". El resto de ellos puede extraerse de la base de datos según sea necesario con un descubrimiento.
> User.find(:all, :conditions => {:email => "[email protected]", :first => "foo"})
=> [#<User id: 1, first: "foo", last: "bar", email: "[email protected]", created_at: "2010-12-30 17:14:28", updated_at: "2010-12-30 17:14:28">,
#<User id: 3, first: "foo", last: "barney", email: "[email protected]", created_at: "2010-12-30 17:14:43", updated_at: "2010-12-30 17:14:43">]
Y También parece que se le quiere añadir un poco mejor la validación de su código para evitar duplicados en el futuro.
Editar:
Si necesita utilizar el martillo grande de find_by_sql
, porque Rails 2.2 y anteriores no apoyaron :having
con find
, el siguiente debe funcionar y le dará la misma matriz que he descrito anteriormente .
User.find_by_sql("select * from users group by first,email having count(*) > 1")
¿Está comprobando antes de guardar un nuevo usuario o que necesitan encontrar usuarios duplicados? – tommasop
Necesito encontrar usuarios duplicados – Trace
Los nombres de usuario van regularmente para tener duplicados.Si está usando sus nombres para proporcionar cuentas únicas, limitará innecesariamente su base de usuarios. En cambio, comience con su dirección de correo electrónico, que será única en Internet. –