2012-04-18 10 views
0

ホテルと場所の2つのモデルがあります。場所はホテルに属し、ホテルには1つの場所があります。私は単一フォームで両方を作成しようとしていますが、依存関係のためにネストされたフォームにdm-nestedを使用できないことに注意してください。Datamapper&Rails(dm-rails)での取引

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

は残念ながら、@のhotel.saveが失敗することができ、私は第2の条件がで実行とは思わなかったので、@のlocation.saveが私を混乱され(完了することができます:

私は次のようなコードを持っています最初のブロックが失敗した場合はブロックします)。

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

答えて

1

DataMapperの中でデータベース操作をラップする通常の方法は、このような何かを行うことです:@hotelがかなり任意である

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

お知らせことを。それは@locationでもよいし、Hotelのようなモデル名さえできます。

私の経験では、これは例外がスローされるのを有効にすると最も効果的です。次に@hotel.saveが失敗すると、例外がスローされ、トランザクションブロックによってキャッチされ、トランザクションがロールバックされます。例外はもちろん、再評価されます。