Rails基于has_many模型列的结果计数查询

时间:2017-07-31 19:43:08

标签: sql ruby-on-rails ruby postgresql activerecord

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'),但除了手动循环所有客户的转变以便找到最常用的车队之外,我真的不知道该去哪里。

提前感谢任何见解!

2 个答案:

答案 0 :(得分:2)

所以,这个答案主要集中在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类中已有的内容中。

答案 1 :(得分: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]}

Shifts分组到Fleets fleets.id之后,我可以更好地构建查询的其余部分,并允许我将数据收集到有意义的哈希中。