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.)