2012-04-18 76 views
0

我有两个模型:酒店和位置。位置属于酒店,酒店有一个位置。我试图创建一个单一的形式,请记住,由于依赖冲突,我不能使用嵌套窗体的dm-nested。Datamapper&Rails(dm-rails)交易

我有如下所示的代码:

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

不幸的是,@ hotel.save可能会失败,并@ location.save可以完成(这让我困惑,因为我没想到第二个条件将在运行如果第一个失败,则阻止)。

我想在交易中包装这些,所以我可以回滚位置保存。我似乎无法找到办法在网上做到这一点。我正在使用dm-rails,rails 3和postgresql数据库。谢谢。

回答

1

的常用方法中的DataMapper包数据库操作是做这样的事情:

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

注意@hotel是很随意的存在;它也可能是@location甚至像Hotel这样的型号名称。

根据我的经验,当您启用异常被抛出时,此功能效果最佳。然后,如果@hotel.save失败,它将抛出一个异常,该异常将被事务块捕获,导致事务回滚。当然,例外是重新评估。