tutorial rails postgres example ruby-on-rails postgresql activerecord

ruby-on-rails - example - rails postgresql jsonb



Encuentra filas con mĂșltiples campos duplicados con Active Record, Rails y Postgres (4)

Basado en la respuesta anterior de @newUserNameHere, creo que la forma correcta de mostrar el conteo de cada uno es

res = User.select(''first, email, count(1)'').group(:first,:email).having(''count(1) > 1'') res.each {|r| puts r.attributes } ; nil

¿Cuál es la mejor forma de encontrar registros con valores duplicados en varias columnas usando Postgres y Activerecord?

Encontré esta solución here :

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

Pero no parece funcionar con postgres. Me aparece este error:

PG :: GroupingError: ERROR: la columna "parts.id" debe aparecer en la cláusula GROUP BY o debe usarse en una función agregada


Ese error ocurre porque POSTGRES requiere que coloque columnas de agrupación en la cláusula SELECT.

tratar:

User.select(:first,:email).group(:first,:email).having("count(*) > 1").all

(nota: no probado, es posible que deba modificarlo)

EDITADO para eliminar la columna de identificación


Si necesita los modelos completos, intente lo siguiente (según la respuesta de @ newUserNameHere).

User.where(email: User.select(:email).group(:email).having("count(*) > 1").select(:email))

Esto devolverá las filas donde la dirección de correo electrónico de la fila no es única.

No estoy al tanto de una forma de hacer esto sobre múltiples atributos.


Versión probada y de trabajo

User.select(:first,:email).group(:first,:email).having("count(*) > 1")

Además, esto es un poco relacionado, pero práctico. Si desea ver cómo se encontró cada combinación, ponga .count al final:

User.select(:first,:email).group(:first,:email).having("count(*) > 1").size

y obtendrás un resultado retrocedido que se ve así:

{[nil, nil]=>512, ["Joe", "[email protected]"]=>23, ["Jim", "[email protected]"]=>36, ["John", "[email protected]"]=>21}

Pensé que era genial y no lo había visto antes.

Gracias a Taryn, esta es solo una versión ajustada de su respuesta.