新手问题 Rails 使用 group 后相应属性的显示问题

brenda103 · 2015年11月11日 · 最后由 brenda103 回复于 2015年11月12日 · 2455 次阅读

将图片一中保存的所有工单按服务需求部门进行分组,

@gongdans = Gongdan.group("department").where(:flag =>2).order(created_at: :desc)

分组后得到结果见下图 我如何获取按服务需求部门分组后, 1、各组累计服务次数,rails c 后 Gongdan.group("department").count 可以得到{ “财务中心” => 3, "三榆“=>1, ”北大街“=>2,"城北”=>2} 怎么才能把这几个数字显示到我的表格中呢? 2、累计服务时间(单个工单的服务时间为@gongdan.updated_at.to_i - @gongdan.created_at.to_i)/60,怎么才能得到各组累加的服务时间呢?

<table class="table table-striped table-hover ">
  <thead>
  <tr>
    <th >部门</th>
    <th >地区</th>
    <th >累计服务次数</th>
    <th >累计服务时间</th>
  </tr>
  </thead>
  <tbody>
  <% @gongdans.each do |g| %>
      <tr >
        <td >
          <%= g.department %>
        </td>
        <td >
          <%= g.area %>
        </td>
        <td >
          <%= g.department.size %>
        </td>
        <td >
        </td>
      </tr>
  <% end %>
  </tbody>
</table>

求各路大神指点迷津!!!小女子在此先谢过!!!

贴代码,而不是用编辑器的截图

请列出你不同 model 之间的关系

#4 楼 @easonlovewan 只有一个 model 就是 gongdan, 是将这里面的数据进行分组,统计分组后的数据,上面就是按 gongdan 的 department 进行的分组

#5 楼 @brenda103 😂感觉表结构需要优化一下........这样的话建议写个 scope,通过不同部门的 name 获取 count[建议]

方案 1 使用缓存字段

departments 增加一个字段用于缓存 gongdan_counter, gongdan_total_durations

使用异步任务和定时脚本更新这个 gongdan_counter, gongdan_total_durations

方案 2 使用统计表 departments_gongdan_stats,表结构如下

  • department_id,加唯一索引
  • gongdan_total_count
  • gongdan_total_durations

使用异步任务和定时脚本更新这个统计表

方案 3 使用 select 把数据捏在一起,捏在一起的这个字段必须是存在的。

Gongdan.where(:flag =>2).group("department").select("count(*) as flag")

http://mednoter.com/group-active-record-querying.html

#7 楼 @xiaoronglv 谢谢你的回复,给的方案现在试试,我用的这个方法,现在就差时间差求和了!

@gongdans = Gongdan.where(:flag =>2).order(created_at: :desc) @gongdans_groups = @gongdans.group_by{|s| s.department}

<% @gongdans_groups.each do |department, gongdans| %> <% end %>
部门 地区 累计服务次数 累计服务时间
<%= department %> <% @area = gongdans.first %> <%= @area.area %> <%= gongdans.size%> <% digit =0 %> <% while digit < gongdans.size do %> <% @list = gongdans[digit] %> <% (@list.updated_at.to_i - @list.created_at.to_i)/60 %> <% digit += 1 %> <% a = (@list.updated_at.to_i - @list.created_at.to_i)/60 %> <%= a %> <% end %>

#7 楼 @xiaoronglv 你的方案三好强大!点一车赞!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号