特定のユーザーアカウントを「サンドボックス」として設定しようとしています。つまり、セッションが破棄されたときにユーザーが行うデータベースの変更をロールバックします。Rails 4では、1人のユーザーに固有のすべてのデータベース変更をどのようにログに記録して元に戻しますか?
ペーパートレイルの宝石を使ってみましたが、1人のユーザーに固有の変更をロールバックするために使用することはできません。
これは可能ですか?
特定のユーザーアカウントを「サンドボックス」として設定しようとしています。つまり、セッションが破棄されたときにユーザーが行うデータベースの変更をロールバックします。Rails 4では、1人のユーザーに固有のすべてのデータベース変更をどのようにログに記録して元に戻しますか?
ペーパートレイルの宝石を使ってみましたが、1人のユーザーに固有の変更をロールバックするために使用することはできません。
これは可能ですか?
これを実行する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
「対応するエンティティを削除する」と言ったとき、実際に作成したレコードはすべて破棄されるという意味ですか?サンドボックスユーザーが既に既存のレコードを更新している場合はどうなりますか?私はちょうどそのアップデートを元に戻し、オブジェクト全体を破壊しないようにしたいと思うだろう。 –
その場合、アクションテーブル(更新、作成など)とaction_details(古い値と影響を受けるフィールドの新しい値のjson)を追跡するために、アクティビティテーブルに列を追加し、それらを使用して変更をロールバックします。 – Anand
しかし、これは乱雑になる可能性があります。サンドボックス化されたユーザーが更新を行い、別のユーザーが同じことを後で更新する可能性があります。他のユーザーによる最新の更新があったため、元のユーザーの更新をロールバックして、新しいユーザーの変更を失うか、それを残すべきですか? – Anand
あなたはすべての関連レコードを削除する意味ですか?あるいは、実際にはスキーマを操作していますか? –
サンドボックスのユーザーにはデフォルトが必要なだけで、ログアウトするとdbはその状態にリセットされます。 – DickieBoy
@KevinBrown:「サンドボックスユーザー」は、すでに存在するレコードに変更を加えている可能性があり、そのユーザーに固有のものではないという考えがあります。例えば、別のユーザによって作成された 'Article'オブジェクトがあり、" sandbox user "が更新を行うとします。私はその更新をロールバックしたいと思いますが、 'Article'レコード全体が削除されるわけではありません。 –