1

J'ai la requête suivante dans mon modèle:Comment obtenir la taille totale du jeu de résultats dans une requête group_by count?

Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc').page(1).per(25).count 

J'utilise la pierre précieuse kaminari pour le problème, mais la pagination est ceci: cette requête renvoie ce qui semble être un hachage triée. Cependant, je n'ai aucun moyen de savoir quel est le nombre total de résultats.

Si vous préférez ne pas prendre en considération kaminari, vous pouvez faire référence à la requête suivante:

Post.where("created_utc > ? AND lower(category) = ?", min_time, subreddit.downcase).group(:domain).order('count_all desc').limit(limit).offset(start).count 

Peu importe, je n'ai aucun moyen de déterminer ce que le nombre total de résultats est. Comment puis-je résoudre ce problème? Existe-t-il un moyen de déterminer quelle serait la taille totale de l'ensemble de résultats sans la limite?

+0

Avez-vous essayé 'taille' au lieu de compter? – BroiSatse

+0

@BroiSatse non, mais même si je le fais, comment cela résout ce problème? –

Répondre

-1

Je divisé à plusieurs lignes:

# 1. get the results 
posts = Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc') 
# 2. count the total size 
total_size = posts.count 
# 3. use kaminari for pagination 
posts_paged = posts.page(1).per(25) 
+0

Mais cela ne se termine-t-il pas par plusieurs requêtes? J'espérais accomplir ceci dans une seule requête. –

+0

Ce dont vous avez besoin sont deux choses distinctes: le nombre total et le tableau de résultat paginé, non? Je pense que vous avez besoin d'au moins deux requêtes pour y parvenir. – Yang

+0

Il existe un moyen d'éviter deux requêtes mais cela peut être beaucoup plus coûteux. Une meilleure idée ici pourrait être de mettre en cache la requête (avec quelque chose comme memcache) afin qu'elle n'ait pas besoin d'être chère à chaque fois. –

0

Outre les méthodes basées rubis, je voudrais aussi référence en cours d'exécution sur la base d'un comptage de base de données séparée.

posts  = Post.where("created_utc > ? AND lower(category) = ?", min_time, subreddit.downcase) 
domain_count = posts.count("distinct domain") 
result  = posts.group(:domain).order('count_all desc').limit(limit).offset(start).count 
0

Qu'est-ce que vous voulez est .length au lieu de .count, comme ceci:

Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc').page(1).per(25).length 
  • .count effectue un SQL COUNT
  • .length calcule la longueur du tableau résultante

gracieuseté de @BenHawker à https://stackoverflow.com/a/34541020/380607