在rails / ruby​​中使用group_by

时间:2011-03-13 20:53:36

标签: ruby-on-rails ruby ruby-on-rails-3

这是我的阵列:

finalcount = Vote.where(:month => month, :year => year, :vote_id => vote.id).count

我想使用group_by(我认为?)按user_id(每次投票都有)对投票进行分组,然后返回票数最高的user_id

我有什么想法可以做到这一点吗?

3 个答案:

答案 0 :(得分:5)

您是否尝试过group方法?

finalcount = Vote.where(:month => month, :year => year, :vote_id => vote.id).group(:user_id).count

将为您提供Hash,其中密钥为user_id,值为count。然后,您可以在此结果上调用max以获取包含user_idcount的双元素数组。

以下是我方便的应用程序示例,我使用计算结果查找正确的模型实例并从中读取属性:

ruby-1.9.2-p136 :001 > ExternalPost.group(:service_id).count
 => {18=>1, 19=>1, 21=>4} 
ruby-1.9.2-p136 :002 > ExternalPost.group(:service_id).count.max
 => [21, 4]
ruby-1.9.2-p136 :003 > Service.find(ExternalPost.group(:service_id).count.max.first).user.first
 => "Brandon"

答案 1 :(得分:0)

如果您的表结构如下:

vote_id
user_id
...

这应该返回一个数组,其中第一个元素是具有最多投票的user_id,第二个元素是该user_id的计数。

Vote.group(:user_id).count.max{|a, b| a.last <=> b.last}

答案 2 :(得分:0)

我认为你真正想要的是:

Vote.select("votes.user_id, count(votes.id)").
  where(:month => month, :year => year, :id => vote.id).
  group("votes.user_id").
  order("count(votes.id) DESC").
  limit(1)

这将获取他们拥有的user_id和投票数,但只返回投票最多的投票。

为什么您的来电有:vote_id => vote.id?您的投票模型是否真的有一个名为vote_id的列,它是否与正常id不同?