Ruby on Rails' ActiveRecord的destroy_all
方法为每条记录生成一个SQL DELETE
查询。我们在Web应用程序中有一个页面,允许用户删除相关记录。由于deleted_at
时间戳关闭了几微秒,因此对同时删除的所有记录进行分组变得具有挑战性。以下是一些示例数据:
id | deleted_at
----+----------------------------
71 |
45 | 2014-04-29 18:35:00.676153
46 | 2014-04-29 18:35:00.685657
47 | 2014-04-30 21:11:00.73096
48 | 2014-04-30 21:11:00.738533
49 | 2014-04-30 21:11:00.745232
50 |
51 |
(8 rows)
所以你可以看到这里有两个事件,一个影响2行(ids 45和46),一个影响3行(ids 47,48和49)。我的问题是如何查询此表,以便将每个事件分组为一行?我考虑过使用extract(microseconds from r.deleted_at)
但如果秒被包裹则会失败。我想要一个查询,甚至是一个比较每条记录的功能,并将deleted_at
之间的记录分组到一个特定的阈值内。
编辑:我应该提一下,我不能使用delete_all
,因为我希望运行回调。我们使用paranoia gem来软删除记录。
答案 0 :(得分:1)
我找到了解决方法。我可以使用update_all
手动设置时间戳,而不是依赖ActiveRecord回调。所以我不是Model.where(...).delete_all
Model.where(...).update_all(deleted_at: Time.current)
而是{{1}}。现在我可以按时间戳轻松分组。
如果有人想回答原始的PostgreSQL查询问题,我很乐意为点选择正确答案。