0

在我的订单控制器中,我正在对另一个对象进行更改,然后再更新订单的属性,例如

def update
  @order.organisation.something = @order.something
  @order.organisation.save!

  if @order.update_attributes(params[:order])
    redirect_to @order
  else
    render :edit
  end
end

原因是我需要订单的先前值(此处称为“某物”)在订单收到新值之前更新组织

我希望,当 update_attributes 由于无效属性而出错时,对组织的更改也会被回滚,显然情况并非如此。所以我的问题是:为什么这种变化不是“隐式”交易的一部分?我怎样才能让它成为它的一部分?

4

1 回答 1

0

我假设您来自 java 并且已经广泛使用事务来管理服务器端的状态。

rails 在这方面有很大不同。它只在更新数据时运行事务。所以调用createor saveorupdate_attributes将是一个单一的事务,如果你想对语句进行分组,你必须自己处理事务。

我曾经创建了一个名为 active_service 的 gem来帮助实现这个功能,但我认为它只是为了通用 Rails 编程而臃肿。但是,它显示了如何在 Rails 中自己处理事务。

它实际上很简单,你可以调用transaction每个ActiveRecord类:

User.transaction { [your transactional code here] }
于 2013-10-20T14:56:28.423 回答