7

所以,我在评论模型上有一个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
}

另外,每次保存评论时都可以初始化一个新的哈希值吗?我想要一些替代品。谢谢

4

2 回答 2

6

您可以创建一个从 1 到加 1 中的最大值的范围,ratings并开始迭代它,产生一个数组,其中第一个元素是当前元素,第二个元素是当前元素出现的总次数ratings。在所有结果都转换为哈希之后:

self.specific_rating = (1..ratings.max + 1).to_h { |e| [e.to_s, ratings.count(e)] }
save
于 2020-03-01T07:47:53.250 回答
1

你也可以做这样的事情 -

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}

于 2020-03-01T08:21:15.137 回答