按属性分组并计算记录

时间:2012-12-21 15:47:32

标签: mysql ruby-on-rails

我需要按名称对查询结果进行分组,并显示每个名称的结果数量。

控制器:

def show
@task = Task.where(:name => params[:name])
   respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @task }
   end
end

我需要定义输出类似内容的东西:

show.html.erb

Name | # of Tasks

Alan |   2
Bob  |   1

我怎样才能做到这一点? 感谢。

2 个答案:

答案 0 :(得分:5)

您可以使用group_by method

@tasks.group_by(&:name)

# this will output:
{
  'Ben' => [<Task id:(...)>],
  'Alon' => [<Task id:(...)>, <Task id:(...)>, ...],
  #...
}

在您看来,您可以像这样使用它:

<% @tasks.group_by(&:name).each do |name, tasks| %>
  <tr>
    <td><%= name %></td>
    <td><%= tasks.size %></td> # the tasks variable is an Array of Tasks
  </tr>
<% end %>

更好的方式

您也可以只在一个SQL请求中执行此操作:

Task.count(:group => 'name')
# should return a Hash like:
{
  'Ben': 2,
  'Alon': 5,
  # ...
}

如何在视图中使用它?

<% @tasks_count.each do |task_name, task_count| %>
  <tr>
    <td><%= task_name %></td>
    <td><%= task_count %></td>
  </tr>
<% end %>

答案 1 :(得分:0)

MrYoushiji给出了正确的答案。 但是您可以通过单个sql请求获取所需的信息:

@task_counts = Task.group(:name).count

# this will output:
{
  'Ben' => 1,
  'Alon' => 2,
  #...
}

用法:

<% @task_counts.each do |name, count| %>
  <tr>
    <td><%= name %></td>
    <td><%= count %></td>
  </tr>
<% end %>