incrément de la valeur dans une table de hachage
J'ai un tas de postes de la catégorie des balises.
J'essaie de savoir combien de fois chaque catégorie a été utilisée.
Je suis à l'aide de rails avec mongodb, MAIS je ne pense pas que j'ai besoin d'être prise en l'occurrence des catégories de la db, de sorte que les mongo de la partie ne compte pas.
C'est ce que j'ai jusqu'à présent
@recent_posts = current_user.recent_posts #retourne les 10 billets les plus récents @categories_hash = {'tech' => 0, 'world' => 0, 'divertissement' => 0, 'sport' => 0} @recent_posts n' |chat| cat.les catégories.chaque do |addCat| @categories_hash.incrément(addCat) #, évidemment, c'est là que je vais avoir des problèmes fin fin fin
la structure de la poste est
{"_id" : ObjectId("idnumber"), "created_at" : "Mar Août 03...", "categories" :["le monde", "sports"], "message" : "le texte de la poste", "poster_id" : ObjectId("idOfUserPoster"), les "électeurs" : []}
Je suis ouvert aux suggestions sur comment pour obtenir le nombre de catégories, mais je veux obtenir le nombre d'électeurs finalement, il me semble donc le meilleur moyen est d'incrémenter la categories_hash, puis ajouter les électeurs.longueur, mais une chose à la fois, je suis juste essayer de comprendre comment faire pour incrémenter les valeurs dans la table de hachage.
OriginalL'auteur pedalpete | 2010-08-05
Vous devez vous connecter pour publier un commentaire.
Si vous n'êtes pas familier avec map/reduce et vous ne se soucient pas de mise à l'échelle, ce n'est pas aussi élégant que map/reduce, mais devrait être suffisant pour les petits sites:
@categories_hash[category] ||= 0
si vous modifiez la première ligne de@categories_hash = Hash.new(0)
ou d'initialiser comme si c'était dans la question d'origine.Vous avez raison, merci. J'oublie toujours de hachage valeurs par défaut. L'édition...
OriginalL'auteur Zargony
Si vous êtes en utilisant mongodb, une manière élégante globale l'utilisation des balises serait, à l'utilisation d'une carte à en réduire l'opération. Mongodb prend en charge la carte/réduction des opérations à l'aide de code JavaScript. Map/reduce s'exécute sur le serveur de base de données(s), par exemple, votre application ne pas avoir à extraire et à analyser chaque document (ce qui ne serait pas à l'échelle pour les grandes collections).
Comme un exemple, voici la carte et de réduire les fonctions que j'utilise dans mon blog sur les articles de la collection pour agréger l'utilisation de balises (qui est utilisé pour construire le nuage de tags dans la barre latérale). Documents dans les articles de la collection ont une clé nommée "tags" qui est titulaire d'un tableau de chaînes de caractères (les balises)
La fonction map tout simplement émet 1 sur chaque étiquette utilisée pour compter:
La fonction de réduction résume les comtes:
En conséquence, la base de données renvoie une valeur de hachage qui a une clé pour chaque balise et son nombre d'utilisations en tant que valeur. E. g.:
C'est sûr qu'il est plus facile de le faire en Ruby, mais également moins efficace, si elle peut être suffisante pour les petits sites. J'ai posté une autre réponse à une variation de votre code d'origine.
OriginalL'auteur Zargony