rails / postgres中的阈值求和

时间:2012-11-13 01:26:02

标签: sql ruby-on-rails ruby-on-rails-3 postgresql arel

我正在制作一个walkathon rails app。每个步行者都是由每人每次承诺最高金额的人赞助。

我有一个名为sponsorships的表,其中包含walker_idamount_per_lapmax_amount列。我想写一个SQL查询来确定沃克筹集了多少钱。

还有一个walkers表,其中包含idnamelaps列。

我知道这不是有效的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

2 个答案:

答案 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