迭代对象并以哈希结果获取结果

时间:2014-09-30 07:27:20

标签: ruby-on-rails ruby

我的数据库中有一个用户表,每个用户的评级形式为1到5。我想找到每个评级的计数。我怎么能用对象做到这一点?

我有一个用户对象。

 [#<User id: 1,  email: "email1@email.com", rating: 1>,#<User id: 2,  email: "email2@email.com", rating: 3 >,#<User id: 3,  email: "email3@email.com", rating: 4 >,#<User id: 4,  email: "email4@email.com", rating: 3 >,#<User id: 5,  email: "email5@email.com", rating: 4 >,#<User id: 7,  email: "email7@email.com", rating: 2 >,#<User id: 8,  email: "email8@email.com", rating: 5 >,#<User id: 9,  email: "email9@email.com", rating: 5 >] 

我想计算每个评分计数的计数;评级1和2评级只有1个计数。我想返回类似的内容:

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

2 个答案:

答案 0 :(得分:5)

试试这个

counts = User.group(:rating).count

<强>更新

如果没有评级,你想返回0,Ruby提供了很多方法。例如,我更喜欢默认Hashhttp://apidock.com/ruby/v1_9_3_392/Hash/new/class

result = Hash.new(0) # 0 here is default value
result.merge!(counts)

result[2] # some value
result[-1] # => 0

答案 1 :(得分:0)

如果你已经有了用户,你可以在ruby中构建一个小直方图,如下所示:

def rating_tally(users)
  result = Hash.new(0);
  users.map(&:rating).each{|k,v| result[k]+=1}
  result
end

rating_tally( user_array )

但是如果你不这样做,那么@gotva的上述sql解决方案会更快更优雅。