2009-03-30 5 views
8

私は複数のページにまたがるフォームを持っています。今設定されている方法は、各ページが送信されるときに(データベースに)保存されるため、理想的ではありません。したがって、ユーザーがすべてのページでフォームを完了しないと、不完全なユーザー登録がデータベースに保存されます。データベーストランザクションを複数の要求にまたがるようにすることは可能ですか?

ユーザーがフォームに完全に記入していない場合は、保存を「ロールバック」したいと思います。

ユーザーが最初のフォームに記入し、最後のページでユーザーが終了したときに開始されるトランザクションを設定する方法はありますか?

答えて

5

あなたが探しているのはacts_as_state_machine gemです。あなたがステートマシンに精通していない場合は、hereをご覧ください。

1

私はあなたの元の質問への答えを知らないが、とにかく...

代わりに、すべてのページに保存するのは、なぜセッション変数内のすべてのデータを保存しませんか?最後に、セッションのデータをデータベースに保存するページを1つ作成できますか?この方法では、DBに何かを部分的に保存したことはありません。

1

長時間実行されているプロセスでユーザーが途中で中断された場合、中間の未確定結果を保存し、後で中断した箇所を取り戻すことができるため、各ページを保存する価値があると思います。

これも良い考えだと思うなら、あなたのデザインには、まだ完成していない長期実行トランザクションの一部であるかどうかを示すフラグが格納されます。最後の部分が終了し、保存ボタンがヒットしたときにフラグを設定します。特定の期間が過ぎれば中間のピースに「最終保存」承認が与えられたかどうかを示すタイムアウト値を与えます。

1

複数の要求にまたがるデータベーストランザクションを開くことは悪い考えです。トランザクションがコミットされる前にユーザーがブラウザを閉じるだけの状況を考えてみましょう。ロールバックもコミットもされていない孤立したトランザクションが残っています。

データベースにREG_COMPLETEのようなフラグを設定するだけで、登録プロセスの最後のページに設定されます。あなたはその不完全なレコードであなたが好きなものをフィルタリング/スクラブすることができます...おそらく、完了するように促す電子メールを送信しますか?

2

特定の質問に答えるために、私はあなたが望むことをするデータベースの意味でトランザクションを設定する方法はないと思います。それについて考えてみましょう。なぜ、複数のページ操作のさまざまな部分が同じプロセスで処理されるという保証はありません。あるいは、おそらく同じサーバーでさえあるでしょう。要求がデータベース接続にまたがる場合、この状況では、ある接続のコミットされていない部分が他の接続から見えなくなります。

既に言及したアイデアと同様に、すでに入力された不完全なデータを保持するために1つ以上の「ステージング」テーブルを使用することを検討します。ユーザーが終了すると、1つのトランザクションでデータが永続表に適用され、ステージング・データが削除されます。不完全なデータは、セッションが終了したことを確信したり、ユーザーが返すまで保持したりすると、要件を満たしていれば、バックグラウンドプロセスによって年齢基準でクリアすることができます。

私は定期的に不完全なトランザクションが発生すると予想される場合、特にこの方法に頼っています。これは、メインモデルの不完全なデータを処理する必要がないためです。

関連する問題