您需要将 soft_delete 设置为在所有相关记录上作为布尔标志进行跟踪。将默认范围设置为仅返回未设置标志的记录。当需要激活或停用时,请收集所有相关记录并使用update_all
. 这是一个针对 13,000 条用户记录运行的示例,让您了解时间和性能:
1.9.2p320 :001 > User.update_all(soft_deleted: false)
SQL (1016.3ms) UPDATE "users" SET "soft_deleted" = 'f'
=> 13350
如您所见,它在大约一秒钟内使用该标志切换击中了所有 13,000 条记录。所以,如果你想点击一个用户,一个用户的所有帖子,以及一个用户的所有 PrivateMessages,
User.update_attributes(soft_deleted: true)
User.posts.update_all(soft_deleted: true)
User.private_messages.update_all(soft_deleted: true)
你应该很高兴。如果您要处理如此多的记录,甚至这种技术也不能很好地执行,我认为您将没有太多选择,除了告诉用户可能需要几分钟才能获得所有数据如您最初计划的那样,重新激活并将整个过程投入后台作业。