16

「よろしいですか? 」という迷惑なポップアップを表示するのではなく、レコードを破棄するときに「元に戻す」メソッドをgmailで使用することが重要だと思います。

これを実装した方法は、モデルに「deleted_at」タイムスタンプ列を作成し、destroyメソッドが呼び出されたときにタイムスタンプを取得することです。

def destroy
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, Time.now)
  ...
end

元に戻す/元に戻すには、同じ列を nil に設定します

def revert
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, nil)
  ...
end

find メソッドを呼び出すときに、「削除された」foo を除外する条件を追加するだけです。おそらく、しばらくしてから「削除された」fooを実際に破棄するようにcronまたはバックグラウンドタスクを設定します。

私にとっては機能し、実装も簡単ですが、この機能を実装するためのより良い方法があるかどうか知りたいですか? たぶん、私が知らないこれを提供するプラグインまたは宝石がありますか?

4

5 に答える 5

4

確かに、アジャイルWeb開発で見つけることができるいくつかのプラグインがあります。

説明に一致すると思われるプラグインのリンクと概要は次のとおりです。

  1. パラノイドとして機能:アクティブレコードを「パラノイド」にします。それらを削除しても行は削除されませんが、deleted_atフィールドが設定されます。検索は、削除されたレコードをスキップするためにオーバーロードされます。
  2. ソフト削除可能として機能:ActiveRecordモデルをソフト削除する機能を提供します。
于 2008-10-14T16:31:49.523 に答える
0

PaperTrailはこれをうまく行います。現在は少し古いですが、優れたRailscastがあります。この質問はかなり前に尋ねられたことを知っていますが、好奇心から偶然見つけたので、これを行うための最新の方法を参照する必要があると思いました.

于 2013-07-11T15:03:55.050 に答える
0

ここには、あなたが必要としているように見えるファイルがありますが、個人的には、特に含めない限り、削除されたレコードを自動的に除外する何かがそこにあるに違いないと思います. そうすれば、それらを再インクルードするパラメーターまたは名前付きスコープを含めない限り、実際には削除されたように見えます。

残念ながら書いたことがなく、時間も限られていますが、それほど難しくはないはずです。

于 2008-10-14T08:46:36.373 に答える
0

削除されたアイテムを別のコレクション(またはテーブルなど)に移動できます。元のリストにあるものはすべて削除されていることがわかり、都合のよいときに新しいリストを処理できます。

于 2008-10-14T15:08:04.390 に答える
-1

責任連鎖パターン

class Action
{
  Perform(context);
  Undo(context);
}
于 2008-10-14T08:48:35.467 に答える