我的数据库中有一个用户表,每个用户的评级形式为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}
答案 0 :(得分:5)
试试这个
counts = User.group(:rating).count
<强>更新强>
如果没有评级,你想返回0,Ruby提供了很多方法。例如,我更喜欢默认Hash
值http://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解决方案会更快更优雅。