4

我正在使用 Rails 并设计一个存储大量用户数据的应用程序。我想让用户能够像 Facebook 那样停用他的帐户,这样如果您重新登录,您的帐户就会重新激活。到目前为止,我已经使用软删除解决了这个问题。问题是,当人们删除他们的帐户时,需要软删除的数据太多,需要一段时间才能运行。自然地,我的直觉是为此使用delayed_job。但问题是,这仅适用于帐户删除,不适用于重新激活。我不希望我的用户在他们的所有数据恢复时必须坐 10 秒钟,但我也不能在后台执行此操作,因为那样他们将在他们的任何数据被恢复之前重新登录恢复。

关于如何解决这个问题的任何想法?

提前致谢!

4

1 回答 1

2

您需要将 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)

你应该很高兴。如果您要处理如此多的记录,甚至这种技术也不能很好地执行,我认为您将没有太多选择,除了告诉用户可能需要几分钟才能获得所有数据如您最初计划的那样,重新激活并将整个过程投入后台作业。

于 2013-04-09T03:56:04.073 回答