我正在制作一个walkathon rails app。每个步行者都是由每人每次承诺最高金额的人赞助。
我有一个名为sponsorships
的表,其中包含walker_id
,amount_per_lap
和max_amount
列。我想写一个SQL查询来确定沃克筹集了多少钱。
还有一个walkers
表,其中包含id
,name
和laps
列。
我知道这不是有效的SQL,但我想要这样的东西,但不知道最好的方法。可以在执行查询之前提供walker_id和laps。
SELECT SUM(MIN(Laps * sponsorships.amount_per_lap,sponsorships.max_amount))FROM赞助商 其中sponsorships.walker_id = 1;
我在轨道上做这个,所以我试图找出如何在Arel中做这样的事情,但是无法理解。
非常感谢任何帮助。
编辑:澄清walkers
表。
Edit2 :在伪代码中意外地有max而不是min
答案 0 :(得分: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来做这样的事情。
答案 1 :(得分: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