如何在Ruby on Rails中获取分组行中的项目数?

时间:2012-02-14 14:42:59

标签: sql ruby-on-rails count grouping

我正在完成我的第一个RoR项目,并正在开发一个排行榜系统,显示用户为正确回答测验问题所积累的积分数。

我收到的所有用户已经回答至少一个问题是正确的,按user_id对它们进行分组,并按照大多数正确的降序显示它们:

@users = Point.find(:all, 
                    :group => 'user_id',
                    :order => 'correct DESC', :conditions => { :correct => "yes"})

在我看来,我正在使用它来迭代结果:

<% @users.each_with_index do |user, index| %>

但是,我无法获得每个用户的正确答案数。我试过了:

user.count 

但这不起作用。如何获得每组的项目数?

4 个答案:

答案 0 :(得分:0)

我认为问题可能是你认为你回来了一个数组,但实际上你得到了哈希。

尝试做:

p @users

(相当于puts @users.inspect)。你可能会看到它更像是:

{ "1" => [UserObject, UserObject], "2" => `[UserObject] }

你甚至可以p @users.class,你会发现它不是一个数组。

当您在哈希上使用.each_with_index循环时,您需要执行以下操作:

@users.each_with_index do |(key, value), index|

然后您可以@users[key].countvalue.count

答案 1 :(得分:0)

想出如何获得正确的计数:

@users = Point.count(:group => :user_id, :conditions => { :correct => "yes"})

答案 2 :(得分:0)

最简单的方法应该是:

@user.points.where(:correct => "yes").count

虽然只有在用户和点模型中定义了关联(如

),这才有效

class User&lt;的ActiveRecord :: Base的 has_many:points

class Point&lt;的ActiveRecord :: Base的 belongs_to:user

(就我个人而言,我会使用bool标志(smallint)代替“正确”列的字符串。

答案 3 :(得分:0)

你走在正确的轨道上。看起来你最好使用all命令,其中包含count条件,而不是count命令。像这样:

Point.all(:select => 'user_id, count(id) as point_count', :group => :user_id, :conditions => { :correct => 'yes' }, :order => 'point_count desc', :limit => 10)

这将返回10个带有Point属性的有限user_id个对象(因此您仍然可以访问user关系),以及带有正确数量的point_count属性积分表示用户已获得。

注意:您可以将限制更改为您希望在排行榜中显示的许多用户。这个例子将返回10。

让代码看起来更合理:

@points = Point.all(:select => 'user_id, count(id) as point_count', :group => :user_id, :conditions => { :correct => 'yes' }, :order => 'point_count desc', :limit => 10)

正如我在下面的评论中所说,您可以通过执行类似的操作来迭代它们(这会假设您的User模型具有名称属性):

<table>
  <% @points.each do |point| %>
    <tr>
      <td><%= point.user.name %></td>
      <td><%= point.point_count %></td>
    </tr>
  <% end %>
</table>