2012-11-13 53 views
1

我正在製作walkathon rails應用程序。每個步行者都由每圈承諾最高金額的人贊助。在rails/postgres中的閾值總和

我有一個名爲sponsorships的表,它具有列walker_id,amount_per_lapmax_amount。我想編寫一個SQL查詢來確定步行者已經籌集了多少錢。

還有一個walkers表具有id,namelaps列。

我知道這不是有效的SQL,但我想要這樣的東西,但不知道最好的辦法。在執行查詢之前,可以提供walker_id和laps。

SELECT SUM(MIN(LAPS * sponsorships.amount_per_lap,sponsorships.max_amount))FROM贊助 其中sponsorships.walker_id = 1;

我在rails中做這個,所以我試圖弄清楚如何在Arel中做這樣的事情,但是弄不清楚。

任何幫助將不勝感激。

編輯:澄清walkers表。

EDIT2:偶然有最大的,而不是分鐘,僞代碼

+0

步行者有一圈專欄 - 我會編輯問題 – Cyrus

回答

2

我認爲你正在尋找的SQL是這樣的:

select w.id, w.name, sum(least(w.laps * s.amount_per_lap, s.max_amount)) 
from walkers w 
join sponsorships s on w.id = s.walker_id 
group by w.id, w.name 

least function是什麼適用於您的「不超過max_amount」的條件。將它翻譯成AR對於你來說應該是一件簡單的事情,現在你知道該如何選擇;我傾向於直接去SQL這樣的事情。

+0

謝謝。我不知道最少的功能。 – Cyrus

+1

@Cyrus:「最少」和「最大」是令人驚訝的有用,但不是很清楚。 –

+1

我很驚訝更多的人不會談論他們。非常有用! – Cyrus

1

我會嘗試這樣的:

class Sponsorship < ActiveRecord::Base 
    name 
    walker_id 
    amount_per_lap 
    max_amount 

class Walker < ActiveRecord::Base 
    name 
    number_of_laps 

walker_sum = 0 
walker=walker.find(1) # For 1 walker. 
walker.sponsorships.each do |sponsor| # 
    walker_sum+= 
    min((sponsor.amount_per_lap * walker.number_of_laps), (sponsor.max_amount)) 
end 
+0

疑難雜症。是用n + 1分貝查詢做到這一點的唯一方法?我希望有一種方法可以在數據庫中進行計算,但如果沒有,我會回頭看看你在這裏寫的內容。謝謝你的幫助。 – Cyrus

+0

更新爲使用min而不是max! –