0

一部のユーザー情報を更新するバックグラウンド プロセスを持つ Rails アプリケーションを開発しています。そのために、このメソッドは既存の情報 (別のテーブルに格納されている) をすべて削除し、インターネットから新しい情報を取得する必要があります。問題は、途中で問題が発生した場合、ユーザーはプロセスが再度実行されるまで情報を取得できないことです。

次のようにすることがあります:

transaction = EntityUser.delete_all(:user_id => @current_user.id)
#instructions that adds new  entity
...
...
transaction.commit

この種の問題を回避するために私にできることを誰かが提案できますか?

ありがとうございました

4

1 に答える 1

1

ActiveRecord::Transactionsについて読んでください。すべてをブロックにラップできます

ActiveRecord::Base.transaction do
  EntityUser.delete_all(:user_id => @current_user.id)

  # ...
end

何か問題がraise ActiveRecord::Rollback発生した場合は、そのブロック内で呼び出して、トランザクション ブロック内のデータベースへのすべての変更を元に戻すことができます。


もう 1 つの考えは、インスタンスをデータベースから実際に削除するのでEntityUserはなく、インスタンスを論理的に削除することです。Userなど、この機能を支援する gem がありますacts_as_paranoid

するでしょう

  1. EntityUserインスタンスのソフト削除
  2. EntityUser新しいインスタンスを取得して構築する
  3. (オプション)すべてがうまくいった場合、論理的に削除されたインスタンスをデータベースからフラッシュします。

この方法を使用して問題が発生した場合は、ソフト削除されたレコードを簡単に元に戻すことができます。

于 2013-01-16T16:34:43.093 に答える