4

ユーザーに関する大量のデータを保存するアプリにRailsとdeviseを使用しています。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 

ご覧のとおり、約 1 秒でそのフラグの切り替えで 13,000 レコードすべてにヒットしました。したがって、ユーザー、ユーザーのすべての投稿、およびすべてのユーザーの PrivateMessage をヒットしたい場合は、

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 に答える