按属性分组并计算记录

Alo*_*iel 1 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
Run Code Online (Sandbox Code Playgroud)

我需要定义输出如下内容的东西:

show.html.erb:

Name | # of Tasks

Alan |   2
Bob  |   1
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?谢谢.

MrY*_*iji 5

您可以使用以下group_by方法:

@tasks.group_by(&:name)

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

在您的视图中,您可以像这样使用它:

<% @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 %>
Run Code Online (Sandbox Code Playgroud)

更好的方法

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

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

如何在您的视图中使用它?

<% @tasks_count.each do |task_name, task_count| %>
  <tr>
    <td><%= task_name %></td>
    <td><%= task_count %></td>
  </tr>
<% end %>
Run Code Online (Sandbox Code Playgroud)