0

特定のユーザーアカウントを「サンドボックス」として設定しようとしています。つまり、セッションが破棄されたときにユーザーが行うデータベースの変更をロールバックします。Rails 4では、1人のユーザーに固有のすべてのデータベース変更をどのようにログに記録して元に戻しますか?

ペーパートレイルの宝石を使ってみましたが、1人のユーザーに固有の変更をロールバックするために使用することはできません。

これは可能ですか?

+1

あなたはすべての関連レコードを削除する意味ですか?あるいは、実際にはスキーマを操作していますか? –

+0

サンドボックスのユーザーにはデフォルトが必要なだけで、ログアウトするとdbはその状態にリセットされます。 – DickieBoy

+0

@KevinBrown:「サンドボックスユーザー」は、すでに存在するレコードに変更を加えている可能性があり、そのユーザーに固有のものではないという考えがあります。例えば、別のユーザによって作成された 'Article'オブジェクトがあり、" sandbox user "が更新を行うとします。私はその更新をロールバックしたいと思いますが、 'Article'レコード全体が削除されるわけではありません。 –

答えて

0

これを実行する1つの方法は、ユーザーがすべてのアクティビティを記録するアクティビティテーブルを用意することです。次に、サンドボックスユーザーが削除されると、そのユーザーのアクティビティを通過し、対応するエンティティを削除できます。

bundle g model Activity user:references thing:references{polymorphic}:index 

、セッションが破棄されます。

current_user_activities = Activity.where(user_id: current_user.id) 
current_user_activities.each do |activity| 
    activity.thing.destroy! 
end 

current_user_activities.destroy_all 
+0

「対応するエンティティを削除する」と言ったとき、実際に作成したレコードはすべて破棄されるという意味ですか?サンドボックスユーザーが既に既存のレコードを更新している場合はどうなりますか?私はちょうどそのアップデートを元に戻し、オブジェクト全体を破壊しないようにしたいと思うだろう。 –

+0

その場合、アクションテーブル(更新、作成など)とaction_details(古い値と影響を受けるフィールドの新しい値のjson)を追跡するために、アクティビティテーブルに列を追加し、それらを使用して変更をロールバックします。 – Anand

+0

しかし、これは乱雑になる可能性があります。サンドボックス化されたユーザーが更新を行い、別のユーザーが同じことを後で更新する可能性があります。他のユーザーによる最新の更新があったため、元のユーザーの更新をロールバックして、新しいユーザーの変更を失うか、それを残すべきですか? – Anand

関連する問題