如何在Ruby on Rails中计算特定评分计数哈希值?

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

I want it to return like:

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

另外,每次保存评论时都初始化一个新哈希表是否可以?我想要一些替代方案。谢谢。

你使用的是哪个 Ruby 版本? - Sebastián Palma
@SebastianPalma 它是2.6.5版本。 - roshita
2个回答

6
您可以从1开始创建范围,一直到ratings中的最大值加上1,并开始遍历它,产生一个数组,其中第一个元素是当前元素,第二个元素是ratings中当前元素出现的次数总和。在所有操作完成后,将结果转换为散列表(hash)。
self.specific_rating = (1..ratings.max + 1).to_h { |e| [e.to_s, ratings.count(e)] }
save

当产品首次创建时,我们应该如何将哈希值初始化为零,并在该产品上创建评分后使用上述函数? - roshita
在迁移中,您可以这样做,即在记录创建时为该列添加默认值 @twinkle。 - Sebastián Palma

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

which gives

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接