Comment puis-je compter le nombre d’enregistrements ayant une valeur unique dans un champ particulier de ROR?

J’ai un jeu d’enregistrements qui inclut un champ de date et je veux déterminer combien de dates uniques sont représentées dans le jeu d’enregistrements.

Quelque chose comme:

Record.find(:all).date.unique.count 

mais bien sûr, cela ne semble pas fonctionner.

Ce que vous voulez, c’est le SQL suivant:

 SELECT COUNT(DISTINCT date) FROM records 

ActiveRecord a ceci intégré:

 Record.count('date', :distinct => true) 

Cela a légèrement changé dans les rails 4 et supérieurs :distinct => true est maintenant obsolète. Utilisation:

 Record.distinct.count('date') 

Ou si vous voulez la date et le numéro:

 Record.group(:date).distinct.count(:date) 

En dehors de SQL:

 Record.find(:all).group_by(&:date).count 

ActiveSupport Enumerable # group_by est indispensable.

Détail de la réponse:

 Post.create(:user_id => 1, :created_on => '2010-09-29') Post.create(:user_id => 1, :created_on => '2010-09-29') Post.create(:user_id => 2, :created_on => '2010-09-29') Post.create(:user_id => null, :created_on => '2010-09-29') Post.group(:created_on).count # => {'2010-09-29' => 4} Post.group(:created_on).count(:user_id) # => {'2010-09-29' => 3} Post.group(:created_on).count(:user_id, :distinct => true) # Rails <= 3 Post.group(:created_on).distinct.count(:user_id) # Rails = 4 # => {'2010-09-29' => 2} 

Comme je l’ai mentionné ici , dans Rails 4, l’utilisation de (...).uniq.count(:user_id) comme mentionné dans d’autres réponses (pour cette question et ailleurs sur SO) conduira à un DISTINCT supplémentaire dans la requête:

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

Ce que nous devons faire est d’utiliser une chaîne SQL nous-mêmes:

(...).count("DISTINCT user_id")

Ce qui nous donne:

SELECT COUNT(DISTINCT user_id) FROM ...

le dernier code source #count on rails n’accepte que 1 paramètre. voir: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

alors j’ai atteint l’exigence par

 Record.count('DISTINCT date') 

Assurez-vous également que vous avez un index sur le champ dans votre firebase database, sinon cette requête deviendra rapidement lente.

(Il est préférable de le faire en SQL, sinon vous tirez toute la table de la firebase database en mémoire pour répondre au compte.)