0

我有两个模型:酒店和位置。一个位置属于一个酒店,一个酒店只有一个位置。我正在尝试以单一形式创建两者,请记住,由于依赖冲突,我不能将 dm-nested 用于嵌套形式。

我的代码如下所示:

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

不幸的是,@hotel.save 可能会失败,而@location.save 可以完成(这让我感到困惑,因为如果第一个条件失败,我认为第二个条件不会在 AND 块中运行)。

我想将这些包装在事务中,以便可以回滚位置保存。我似乎无法在网上找到一种方法。我正在使用 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 回答