1

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

控制器:

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

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

显示.html.erb

Name | # of Tasks

Alan |   2
Bob  |   1

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

4

2 回答 2

5

您可以使用以下group_by方法

@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 %>
于 2012-12-21T15:50:58.023 回答
0

优时基先生给出了正确答案。但是您可以通过单个 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 %>
于 2012-12-21T15:57:17.607 回答