Datamapper&中的交易导轨(dm-rails)

时间:2012-04-18 09:08:23

标签: ruby-on-rails-3 postgresql transactions datamapper

我有两种型号:酒店和位置。一个位置属于酒店,酒店有一个位置。我试图以单一形式创建两者,请记住,由于依赖性冲突,我不能使用嵌套表单的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数据库。感谢。

1 个答案:

答案 0 :(得分:1)

在DataMapper中包装数据库操作的常用方法是执行以下操作:

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

请注意,@hotel在那里非常随意;它也可以是@location甚至是Hotel等模型名称。

根据我的经验,当您启用异常时,这种方法效果最佳。然后,如果@hotel.save失败,它将抛出一个异常,该异常将被事务块捕获,从而导致事务被回滚。当然,例外是再加注。