使用后台任务软删除庞大的用户帐户

时间:2013-04-08 23:49:41

标签: ruby-on-rails devise delayed-job

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

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

提前致谢!

1 个答案:

答案 0 :(得分: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条记录中用该标志切换大约一秒钟。所以,如果你想点击一个用户,所有用户的帖子,以及所有用户的私人消息,

User.update_attributes(soft_deleted: true)
User.posts.update_all(soft_deleted: true)
User.private_messages.update_all(soft_deleted: true)

你应该好好去。如果您正在处理如此多的记录,即使这种技术表现不佳,我也不认为您会有太多选择,除非告诉用户可能需要一段时间才能获得所有数据。重新激活并将整个过程投入后台工作,正如您最初计划的那样。