значение приращения в хэше - PullRequest
3 голосов
/ 05 августа 2010

У меня есть куча постов, в которых есть теги категорий. Я пытаюсь выяснить, сколько раз использовалась каждая категория.

Я использую рельсы с mongodb, НО я не думаю, что мне нужно получать вхождения категорий из БД, поэтому часть монго не должна иметь значения.

Это то, что я имею до сих пор

@recent_posts = current_user.recent_posts #returns the 10 most recent posts
@categories_hash = {'tech' => 0, 'world' => 0, 'entertainment' => 0, 'sports' => 0}
    @recent_posts do |cat|
       cat.categories.each do |addCat|
         @categories_hash.increment(addCat) #obviously this is where I'm having problems
       end
     end
end

структура поста

{"_id" : ObjectId("idnumber"), "created_at" : "Tue Aug 03...", "categories" :["world", "sports"], "message" : "the text of the post", "poster_id" : ObjectId("idOfUserPoster"), "voters" : []}

Я открыт для предложений о том, как еще подсчитать количество категорий, но я в конечном итоге захочу подсчитать число избирателей, так что, мне кажется, лучший способ - это увеличить значение category_hash, а затем добавить избирателей Длина, но одна вещь за раз, я просто пытаюсь выяснить, как увеличить значения в хэше.

Ответы [ 2 ]

8 голосов
/ 05 августа 2010

Если вы не знакомы с картой / уменьшением и вам не нужно увеличивать масштаб, это не так элегантно, как карта / уменьшить, но этого должно быть достаточно для небольших сайтов:

@categories_hash = Hash.new(0)
current_user.recent_posts.each do |post|
  post.categories.each do |category|
    @categories_hash[category] += 1
  end
end
1 голос
/ 05 августа 2010

Если вы используете mongodb, элегантный способ агрегировать использование тегов - использовать операцию map / сокращения.Mongodb поддерживает операции отображения / сокращения с использованием кода JavaScript.Отобразить / уменьшить количество прогонов на сервере (ах) базы данных, т. Е. Вашему приложению не нужно извлекать и анализировать каждый документ (что не подходит для больших коллекций).

В качестве примера приведем картуи уменьшить количество функций, которые я использую в своем блоге для коллекции статей, чтобы объединить использование тегов (которые используются для построения облака тегов на боковой панели).Документы в коллекции статей имеют ключ с именем «tags», который содержит массив строк (тегов)

Функция map просто выбрасывает 1 на каждый используемый тег для его подсчета:

function () {
  if (this.tags) {
    this.tags.forEach(function (tag) {
      emit(tag, 1);
    });
  }
}

Функция Reduce суммирует значения:

function (key, values) {
  var total = 0;
  values.forEach(function (v) {
    total += v;
  });
  return total;
}

В результате база данных возвращает хеш, в котором есть ключ для каждого тега и счетчик его использования в качестве значения.Например:

{ 'rails' => 5, 'ruby' => 12, 'linux' => 3 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...