Ruby on rails 3.2 控制器更新操作中的事务何时开始?

Ruby on rails 3.2 控制器更新操作中的事务何时开始?,ruby-on-rails-3.2,Ruby On Rails 3.2,在订单的控制器中,在更新订单属性之前,我正在对另一个对象进行更改,如 def update @order.organisation.something = @order.something @order.organisation.save! if @order.update_attributes(params[:order]) redirect_to @order else render :edit end end 原因是我需要订单的先前值(这里称为“某物

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

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

  if @order.update_attributes(params[:order])
    redirect_to @order
  else
    render :edit
  end
end
原因是我需要订单的先前值(这里称为“某物”)在订单收到新值之前更新组织


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

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

rails在这方面非常不同。它仅在更新数据时运行事务。因此,对
create
save
update\u attributes
的调用将是单个事务,如果要对语句进行分组,您必须自己处理事务

我曾经创建它来帮助实现这一功能,但我认为这只是为了实现通用rails编程。然而,它展示了如何在rails中自己处理事务

实际上非常简单,您可以在每个
ActiveRecord
类上调用
transaction

User.transaction { [your transactional code here] }

为什么要保存@order.organization?只需使用\@order.organization.something=\@order.something和rails在保存@order后会自动保存Organization。我必须说我没有意识到这一点。。。(在rails上很新)有关于这个的建议吗?我认为(阅读)控制器启动了一个隐式事务,它涵盖了所有数据库更改。不正确?这是由于“自动保存关联”造成的吗?不,rails不会为控制器的任何操作启动任何隐式事务。我预先假设您使用了autosave选项为正确。我开始阅读这方面的内容,总结一下,我理解保存或创建会启动事务,因此,来自此保存或创建的回调中的所有对象修改都在该事务中处理。如果我需要更多,我必须自己明确地启动一个事务。好的总结?总结得很好。