2017-07-31 126 views
2
Customer has_many Shifts through Jobs 
Shifts belong_to Truck 
Trucks belong_to Fleet 

我试图衡量客户已预订的前5名使用最多的fleets,以及班次数。理想情况下,我会得到Fleet A: X shifts等等。基于has_many模型列的结果计数的Rails查询

我尝试过使用customer.shifts.joins(:fleets).select('*, count(shifts.fleet_id) as fleet_count').order('fleet_count desc'),但我并不真正知道该去哪里,除了手动循环遍历客户的所有班次以找到使用最多的车队。

在此先感谢您的任何见解!

+1

没有太深入这个问题(抱歉吃午饭),因为这基本上听起来像它需要在需要时是最新的,而不是通过递归方法调用。您可能希望将此逻辑驻留在数据库中,并在更新换班时通过触发器更新列。但是,数据库级逻辑引入了其他维护/升级问题,所以... YMMV – engineerDave

回答

0

因此,通过与我的同事一起工作,我们似乎找到了答案。

Customer.find(8).shifts.joins(:fleet).group('fleets.id').select('fleets.name as fleet_name, count(*) as shift_count').order('shift_count desc').limit(5).collect{|f|[f.fleet_name, f.shift_count]}

分组的ShiftsFleets通过fleets.id结构化查询更好的休息,让我的数据收集到一个有意义的哈希值。

2

所以,这是答案侧重于SQL,我不知道最好的方法来将它转换回活动的记录方法。这是一个专注于Shifts表的查询,并非真正关注Customer表,您甚至不需要加入Customer表。加入轮班,卡车和车队。使用与您感兴趣的客户匹配的shifts.customer_id中的where子句筛选结果。选择count(*)并使用group by fleet.id。按数量排序并将结果限制为5,并且您将得到结果集。

select count(*) as shift_count, fleets.id from shifts 
    inner join trucks on shifts.truck_id = trucks.id 
    inner join fleets on trucks.fleet_id = fleets.id 
    where shifts.customer_id = 1 
    group by fleets.id 
    order by shift_count DESC 
    limit 5; 

要翻译这回活动记录代码,我觉得你可以做的主要事情是找到一种方法,包括group by条款列入你已经拥有的客户类。