2017-07-31 146 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條款列入你已經擁有的客戶類。