GOOGLE ADS

samedi 30 avril 2022

Trouvez des lignes avec plusieurs champs en double avec Active Record, Rails et Postgres

Quelle est la meilleure façon de trouver des enregistrements avec des valeurs en double sur plusieurs colonnes à l'aide de Postgres et d'Activerecord ?

J'ai trouvé cette solution ici:

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

Mais cela ne semble pas fonctionner avec postgres. J'obtiens cette erreur :

PG::GroupingError : ERREUR : la colonne "parts.id" doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation


Solution du problème

Version testée et fonctionnelle

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

De plus, c'est un peu sans rapport mais pratique. Si vous voulez voir combien de fois chaque combinaison a été trouvée, mettez.size à la fin :

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

et vous obtiendrez un ensemble de résultats qui ressemble à ceci :

{[nil, nil]=>512,
["Joe", "test@test.com"]=>23,
["Jim", "email2@gmail.com"]=>36,
["John", "email3@gmail.com"]=>21}

Je pensais que c'était plutôt cool et je ne l'avais jamais vu auparavant.

Merci à Taryn, ce n'est qu'une version modifiée de sa réponse.

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...