事务何时在控制器更新操作中启动?

时间:2013-10-20 08:17:41

标签: 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

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

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

1 个答案:

答案 0 :(得分:0)

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

在这方面,轨道是非常不同的。它只在更新数据时运行事务。因此,对createsaveupdate_attributes的调用将是单个事务,如果要对语句进行分组,则必须自行处理事务。

我曾经创建a gem called active_service以帮助实现此功能,但我认为这只是为了通用轨道编程而臃肿。但是,它显示了如何在rails中处理事务。

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

User.transaction { [your transactional code here] }