如何计算 ruby​​ on rails 中的特定评分计数哈希?

Posted

技术标签:

【中文标题】如何计算 ruby​​ on rails 中的特定评分计数哈希?【英文标题】:How to calculate specific rating count hash in ruby on rails? 【发布时间】:2020-03-01 07:29:52 【问题描述】:

所以,我在 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 版本? @SebastianPalma 2.6.5 【参考方案1】:

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

self.specific_rating = (1..ratings.max + 1).to_h  |e| [e.to_s, ratings.count(e)] 
save

【讨论】:

谢谢!!首次创建产品时,我们应该如何将哈希值初始化为零。并在该产品上创建评级后使用上述功能 您可以在迁移中执行此操作,在创建记录时为该列添加默认值@twinkle。【参考方案2】:

你也可以这样做 -

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

【讨论】:

以上是关于如何计算 ruby​​ on rails 中的特定评分计数哈希?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 6 - 如何根据特定路线建模/隐藏视图?

如何存储和比较:ActiveRecord 中的符号(Ruby on Rails)

如果 Ruby on Rails 中有设置限制,如何显示特定的 div 元素

ruby on rails在特定列名后添加一列。

如何在 Ruby on Rails 中创建一个包罗万象的路由?

Ruby on Rails,如何确定请求是由机器人还是搜索引擎蜘蛛制作的?