将数组限制为rails3中记录中值的总和

时间:2011-10-08 02:34:06

标签: ruby-on-rails ruby ruby-on-rails-3

假设我在Post模型中有以下内容,每个记录都有字段“num”,其中包含一个数字的随机值和一个user_id。

所以我这样做了:

@posts = Post.where(:user_id => 1)

现在假设我想限制我的@posts数组的记录在num值中的总和为50或更多(只有最终记录超过限制)。所以它会添加post.num + post2.num + post3.num等,直到总数达到50以上。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

我想说的就是抓住你已经存在的所有记录:

@posts = Post.where(:user_id => 1)

然后使用Ruby来完成剩下的工作:

sum, i = 0, 0
until sum >= 50
  post = @posts[i].delete
  sum, i = sum+post.num, i+1
end

可能有更优雅的方式,但这会奏效。它会按顺序删除帖子,直到sum超过或等于50.然后@posts将剩下其余的记录。希望我理解你的问题。

答案 1 :(得分:0)

您需要使用PostgreSQL Window functions

这为您提供净额低于50

的行
SELECT a.id, sum(a.num) num_sum OVER (ORDER BY a.user_id) 
FROM   posts a
WHERE  a.user_id = 1 AND a.num_sum  < 50

但是你的情况比较困难,因为你想要超过限制一行:

SELECT a.id, sum(a.num) num_sum OVER (ORDER BY a.user_id) 
FROM   posts a
WHERE  a.user_id = 1 AND a.num_sum  <= (
  SELECT MIN(c.num_sum) 
  FROM (
    SELECT sum(b.num) num_sum OVER (ORDER BY b.user_id) 
    FROM   posts b
    WHERE  b.user_id = 1 AND b.num_sum  >= 50
  ) c )

您必须将此SQL转换为Arel。