我有一个日志表,其中包含用户条目。我想要(删节)删除每个用户的所有内容,但最后100个除外。我想以最有效的方式做到这一点(如果可能的话,使用ActiveRecord一条语句)。
我知道我可以使用以下内容:
.order(created_at: :desc)
对记录进行排序.offset(100)
获取除我要保留的记录以外的所有记录.ids
提取记录ID select(:user_id).distinct
获取表中所有用户的列表该表具有id
,user_id
,created_at
列(以及其他与该问题无关的列)。
每个用户至少应有剩余的100条日志条目。
我不太确定如何在我的Log模型中使用ruby语法来做到这一点。如果无法使用ruby有效地完成此任务,那么我将求助于使用SQL等效项。
非常感谢任何帮助。
答案 0 :(得分:0)
在SQL中,您可以这样做:
DELETE FROM logs
USING (SELECT id
FROM (SELECT id,
row_number()
OVER (PARTITION BY user_id
ORDER BY created_at DESC)
AS rownr
FROM logs
) AS a
WHERE rownr > 100
) AS b
WHERE logs.id = b.id;
如果表很大,那会很慢。