Как рассчитать удельный c рейтинг количества га sh в ruby на рельсах? - PullRequest
7 голосов
/ 01 марта 2020

Итак, у меня есть after_save ловушка для обзора модели, которая вызывает Calculate_Specific_rating функции модели продукта. Функция выглядит следующим образом:

def calculate_specific_rating
    ratings = reviews.reload.all.pluck(:rating)
    specific_rating = Hash.new(0)
    ratings.each { |rating| specific_rating[rating] += 1 }
    self.specific_rating = specific_rating
    save
  end

Сейчас она возвращает

specific_rating => { 
"2"=> 3, "4"=> 1
}

Я хочу, чтобы она возвращалась следующим образом:

specific_rating => { 
"1"=> 0, "2"=>3, "3"=>0, "4"=>1, "5"=>0
}

Кроме того, все в порядке инициализировать новый ха sh при каждом сохранении обзора? Я хочу альтернативу. Спасибо

Ответы [ 2 ]

6 голосов
/ 01 марта 2020

Вы можете создать диапазон от 1 до максимального значения в ratings плюс 1 и начать итерацию по нему, получая массив, где первый элемент является текущим, а второй элемент - суммой, умноженной на текущий элемент. присутствует в ratings. После всего результат конвертируется в га sh:

self.specific_rating = (1..ratings.max + 1).to_h { |e| [e.to_s, ratings.count(e)] }
save
1 голос
/ 01 марта 2020

Вы также можете сделать что-то вроде этого -

def calculate_specific_rating
  ratings = [1,2,3,4,5]
  existing_ratings = reviews.group_by(&:rating).map{|k,v| [k, v.count]}.to_h
  Hash[(ratings - existing_ratings.keys).map {|x| [x, 0]}].merge(existing_ratings)
end

, что дает

{3 => 0, 4 => 0, 5 => 0, 2 => 3, 1 => 1}

...