按两个参数分组

时间:2012-12-22 01:47:25

标签: ruby-on-rails

在tasks_controller中,我定义了:

def index
    @tasks = Task.all

    respond_to do |format|
       format.html # index.html.erb
       format.json { render json: @tasks }
    end
end

我的表中有三个参数:name,task,done。

现在,我想制作:

<table>
    <tr>
        <th>Name</th>
        <th>num of tasks</th>
        <th>num tasks left</th>
    </tr>

    <% @tasks.group_by(&:name).each do |name, tasks| %>
        <tr>
            <td><%= name %></td>
            <td><%= tasks.size %></td>
            <td> here I want to produce the number of tasks left </td>
        </tr>
    <% end %>
</table>

如何才能获得剩余的任务数量?我认为应该是这样的:

        <% @tasks.group_by(&:name).each do |name, tasks| %>
             <tr>
                <td><%= name %></td>
                <td><%= tasks.size %></td>
                <% @tasks.group_by(name, :done => "yes").each do |name, tasks| %>
                     <td><%= tasks.size %></td>
                <% end %>
             </tr> 
         <% end %>

1 个答案:

答案 0 :(得分:1)

你有个好主意;)

<% @tasks.group_by(&:name).each do |name, tasks| %>
  <tr>
    <td><%= name %></td>
    <td><%= tasks.size %></td>
    <td><%= tasks.select{ |task| task.done != 'yes' }.size %></td>
  </tr> 
<% end %>

tasks.select{ |task| task.done != 'yes' }:这将选择完成不是的任务,将其放入数组并计算其大小(尚未完成的任务数)。

我强烈建议您将@tasks变量设置为如下(性能要低得多:数据库为您完成工作!)

# in the controller
@tasks = Task.count(:group => 'name') #instead of @tasks = Task.all

它与@tasks.group_by(...)具有相同的输出,但执行时间要好得多。