0

ホテルと場所の 2 つのモデルがあります。ロケーションはホテルに属し、ホテルには 1 つのロケーションがあります。両方を単一のフォームで作成しようとしていますが、依存関係の衝突により、ネストされたフォームに dm-nested を使用できないことに注意してください。

次のようなコードがあります。

if (@hotel.save && @location.save)
  # process
else
  # back to form with errors
end

残念ながら、@hotel.save は失敗し、@location.save は完了する可能性があります (最初の条件が失敗した場合に AND ブロックで 2 番目の条件が実行されるとは思わなかったため、混乱します)。

場所の保存をロールバックできるように、これらをトランザクションでラップしたいと思います。私はそれをオンラインで行う方法を見つけることができないようです。dm-rails、rails 3、および postgresql データベースを使用しています。ありがとう。

4

1 に答える 1

1

DataMapperでデータベース操作をラップする通常の方法は、次のようなことを行うことです。

@hotel.transaction do
  @hotel.save
  @location.save
end

@hotelそこではかなり恣意的であることに注意してください。@locationのようなモデル名でもかまいませんHotel

私の経験では、これは例外のスローを有効にした場合に最適に機能します。次に@hotel.save失敗すると、例外がスローされ、トランザクションブロックによってキャッチされ、トランザクションがロールバックされます。もちろん、例外はリレイズされます。

于 2012-04-18T13:12:56.743 に答える