所以,我在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
}
我希望它返回:
specific_rating => {
"1"=> 0, "2"=>3, "3"=>0, "4"=>1, "5"=>0
}
而且,每次保存评论时,都可以初始化一个新的哈希吗?我想要其他选择。谢谢
您可以创建一个从0到ratings
中最大值的范围,并开始对其进行迭代,检查当前索引是否在ratings
中,如果是,则过滤并产生所有它们,否则按一下就产生索引:
specific_rating = (0..ratings.max).flat_map do |e|
if ratings.include?(e)
ratings.select { |f| f == e }
else
e
end
end.each_with_object(Hash.new(0)) { |e, hash| hash[e] += 1 }
self.specific_rating = specific_rating
save
之后,您可以像以前一样对元素进行计数。
您也可以做这样的事情-
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}