Ruby on rails 迭代对象并在哈希中获得结果

Ruby on rails 迭代对象并在哈希中获得结果,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的数据库中有一个users表,每个用户的评分表为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 >,#<Us

我的数据库中有一个users表,每个用户的评分表为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 >] 
试试这个

counts = User.group(:rating).count
更新

如果您想在没有评级的情况下返回0,Ruby提供了很多方法。例如,我更喜欢默认哈希值


如果您已经有了用户,您可以在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解决方案会更快、更优雅。

我想从1迭代到5,就像没有1时,它应该返回{1=>0}。你找到@neo代码的解决方案了吗?我也有类似的问题
result = Hash.new(0) # 0 here is default value
result.merge!(counts)

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

rating_tally( user_array )