使用acts_as_paranoid gem调用destroy时如何更新updated_at字段?
在acts_as_paranoid中调用destroy时同步更新updated_at的方法
有两种常用方法可以实现软删除时同时更新updated_at字段:
方法一:重写模型的soft_destroy方法
acts_as_paranoid的destroy方法最终会调用内部的soft_destroy执行软删除逻辑,直接重写这个方法可以一次更新两个字段,效率更高:
class YourModel < ApplicationRecord acts_as_paranoid def soft_destroy update_columns(deleted_at: Time.current, updated_at: Time.current) end end
update_columns会直接执行SQL更新,不触发任何回调,避免额外逻辑干扰。
方法二:使用软删除回调
利用acts_as_paranoid提供的after_soft_destroy回调,在软删除完成后手动更新updated_at:
class YourModel < ApplicationRecord acts_as_paranoid after_soft_destroy do update_column(:updated_at, Time.current) end end
这里用update_column而非update,是为了跳过模型验证和其他回调,防止出现循环调用或不必要的操作。
注意事项
- 确保模型对应的数据库表存在
updated_at字段(Rails生成模型时默认添加,除非手动移除)。 - 避免使用
save或update这类会触发完整回调链的方法,否则可能导致软删除逻辑重复执行或触发意外行为。
内容的提问来源于stack exchange,提问作者nabais
相关产品推荐
相关产品推荐

