新手问题 请问如何在循环下,用事务包含所有的循环的 save

QueXuQ · 2012年12月03日 · 最后由 QueXuQ 回复于 2012年12月03日 · 2576 次阅读

订单下的产品,我想确认订单后,把订单下的产品全部 save 了。 就是里面有个方法是这样的:

订单.产品s.each do |产品|
  日志 = 日志.new
  产品.数量 = 订单.数量
  日志.产品 = 产品
  ActiveRecord::Base.transaction do
    产品.save!
    日志.save!
  end
end
订单.状态 = true
订单.save

如果按照上面的写法,一个不知道什么原因,导致某些产品或者日志没有保存下来,而又不可以完全回滚上去。 或者订单状态保存失败,也无法把产品和日志进行回滚。 请问用什么样的方法才可以吧:

  ActiveRecord::Base.transaction do
    产品.save!
    日志.save!
    .....(有产品和日志)
    订单.save!
  end
```
放在一个事务里呢?

加个多态的关联,然后产品.logs.build. 这样也便于产品查日志

先说明用什么数据库吧

#1 楼 @Ddl1st 不是说那个 log 与产品的关系怎么弄呢。是说我怎么可以把这个方法里的所有 save 都用同一个 ActiveRecord::Base.transaction 事务包在一起。 #2 楼 @cxh116 不好意思呢。是 MySQL 的。

#3 楼 @QueXuQ 表用的是 mysql 的什么引擎?MyISAM 是不支持事务的,默认的 InnoDB 是支持事务的

ActiveRecord::Base.transaction do
订单.产品s.each do |产品|
  日志 = 日志.new
  产品.数量 = 订单.数量
  日志.产品 = 产品

    产品.save!
    日志.save!
end
订单.状态 = true
订单.save!
end

这样符合你的业务逻辑吗?只要有一个产品保存失败,那么整个订单的修改都回滚

#4 楼 @cxh116 恩。默认的 InnoDB。 恩。这样可以的。原来可以把循环等东西放进ActiveRecord::Base.transaction do里,一直不知道。谢谢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号