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.