Как получить количество элементов в сгруппированной строке в Ruby on Rails? - PullRequest
0 голосов
/ 14 февраля 2012

Я заканчиваю свой первый проект 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 голосов
/ 14 февраля 2012

Вы на правильном пути.Похоже, вам лучше использовать команду all с условием подсчета, а не команду 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 имеет атрибут name):

<table>
  <% @points.each do |point| %>
    <tr>
      <td><%= point.user.name %></td>
      <td><%= point.point_count %></td>
    </tr>
  <% end %>
</table>
0 голосов
/ 14 февраля 2012

Разобрался, как получить правильный счет:

@users = Point.count(:group => :user_id, :conditions => { :correct => "yes"})
0 голосов
/ 14 февраля 2012

Самый простой способ должен быть:

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

Хотя это будет работать, только если вы определили ваши ассоциации в пользовательской и точечной модели, как

класс User

класс Point

(лично я бы использовал вместо строки для правильного столбца флаг bool (smallint).

0 голосов
/ 14 февраля 2012

Я думаю, что проблема может заключаться в том, что вы думаете, что получаете массив, но на самом деле вы получаете хэш обратно.

Попробуйте сделать:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...