2

Dans Rails, vous pouvez utiliser:Comment grouper et compter les derniers N résultats?

Model.group (champ) .Count

pour obtenir quelque chose comme:

{ "a" => 7, " b "=> 5, "c"=> 3 "d"=> 3, "e"=> 4}

Mais comment puis-je compter seulement dans le dernières lignes N, pas la table entière, avec le DATABASE faire les calculs?

Ne pas travailler:

Model.limit (100) .group (champ) .Count

limite limitera les clés de sortie de hachage pas les lignes de table utilisées

Model.last (100) .group (champ) .Count

Retourne le dernier un Array et déclenche une erreur

J'utilise: * Ruby 2.3.3p222 * Rails * pg 4.2.4 9.5.6

+1

Cela devrait fonctionner: 'Model.where (id: Model.limit (100) .select (: id)) du groupe. (Champ) .count' – AbM

+0

@AbM Je peux seulement dire: Headshot! S'il vous plaît, utilisez la "réponse" que je peux l'accepter. –

Répondre

2

Comme vous l'avez mentionné, la limit est appliquée sur les cas groupés, pas les instances elles-mêmes. Une solution simple serait:

Model.where(id: Model.limit(100).select(:id)).group(:field).count

+0

Nous avons oublié la ** commande ** pour obtenir les derniers résultats: > Vote.where (id: Vote.limit (100) .select (: id) .order (created_at:: desc)) .group (: emotion).compter –

1

objets Array peuvent également être groupés en utilisant group_by:

grouped = Model.last(100).group_by(&:field).map { |k,v| [k, v.length] } 

Cette renverra la matrice suivante:

#=> [["Field value 1", value_1_count], ["Field value 2", value_2_count], etc...] 

La matrice peut également être transformée en a h:

grouped.each_with_object({}) { |value, memo| memo[value[0]] = value[1] } 

Pour résumer, essayez ce qui suit:

Model.last(100) 
    .group_by(&:field) 
    .each_with_object({}) { |(key, value), memo| memo[key] = value.length } 
+0

Vous avez posté une très bonne réponse et pour être honnête, je dois accepter son. Mais je vais mettre à jour la question parce que j'avais omis à tort une information très importante: pas dans le tableau, mais dans SQL (donc la basebase fera le calcul > Model.group (: field) .count Faire le calcul avec base de données, pas un calcul de tableau (ruby) Puis-je avoir ceci? –