假设我在Post模型中有以下内容,每个记录都有字段“num”,其中包含一个数字的随机值和一个user_id。
所以我这样做了:
@posts = Post.where(:user_id => 1)
现在假设我想限制我的@posts数组的记录在num值中的总和为50或更多(只有最终记录超过限制)。所以它会添加post.num + post2.num + post3.num等,直到总数达到50以上。
有办法做到这一点吗?
答案 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。