如何计算Rails中红宝石的特定评级计数哈希?

问题描述 投票:5回答:2

所以,我在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
}

而且,每次保存评论时,都可以初始化一个新的哈希吗?我想要其他选择。谢谢

ruby-on-rails ruby hash after-save
2个回答
3
投票

您可以创建一个从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

之后,您可以像以前一样对元素进行计数。


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}

© www.soinside.com 2019 - 2024. All rights reserved.