在我订单的控制器中,我在更新订单的属性之前对另一个对象进行了更改,例如
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由于无效属性而导致错误时,组织的更改也会被回滚,显然情况并非如此。所以我的问题是:为什么这种变化不是“隐含”交易的一部分?我怎样才能让它成为它的一部分?
答案 0 :(得分:0)
我假设您来自java并且已广泛使用事务来管理服务器端的状态。
在这方面,轨道是非常不同的。它只在更新数据时运行事务。因此,对create
或save
或update_attributes
的调用将是单个事务,如果要对语句进行分组,则必须自行处理事务。
我曾经创建a gem called active_service以帮助实现此功能,但我认为这只是为了通用轨道编程而臃肿。但是,它显示了如何在rails中处理事务。
实际上非常简单,你可以在每个transaction
类上调用ActiveRecord
:
User.transaction { [your transactional code here] }