我有两种型号:酒店和位置。一个位置属于酒店,酒店有一个位置。我试图以单一形式创建两者,请记住,由于依赖性冲突,我不能使用嵌套表单的dm嵌套。
我的代码如下:
if (@hotel.save && @location.save)
# process
else
# back to form with errors
end
不幸的是,@ hotel.save可能会失败并且@ location.save可以完成(这让我感到困惑,因为如果第一个条件失败,我认为第二个条件不会在AND块中运行。)
我想将它们包装在一个事务中,以便我可以回滚Location保存。我似乎无法在网上找到办法。我正在使用dm-rails,rails 3和postgresql数据库。感谢。
答案 0 :(得分:1)
在DataMapper中包装数据库操作的常用方法是执行以下操作:
@hotel.transaction do
@hotel.save
@location.save
end
请注意,@hotel
在那里非常随意;它也可以是@location
甚至是Hotel
等模型名称。
根据我的经验,当您启用异常时,这种方法效果最佳。然后,如果@hotel.save
失败,它将抛出一个异常,该异常将被事务块捕获,从而导致事务被回滚。当然,例外是再加注。