Customer has_many Shifts through Jobs
Shifts belong_to Truck
Trucks belong_to Fleet

我试图衡量客户预订轮班的前5个最常用的fleets,以及轮班数量。理想情况下,我会得到Fleet A: X shifts等等。
我试过使用customer.shifts.joins(:fleets).select('*, count(shifts.fleet_id) as fleet_count').order('fleet_count desc')但是我真的不知道该去哪里,除了手动循环一个客户的所有轮班以找到最有用的车队。
提前感谢您的任何见解!

最佳答案

所以,这是一个关注sql的答案,我不确定将其转换回活动记录方法的最佳方法。这是一个关注shifts表的查询,而不是真正关注customer表,您甚至不需要加入customer表。加入轮班、卡车和车队。使用与您感兴趣的客户匹配的where上的shifts.customer_id子句筛选结果。选择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子句包含到您在customers类中已经拥有的内容中。

09-27 20:13