我正在完成我的第一个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
但这不起作用。如何获得每组的项目数?
答案 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].count
或value.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>