Ruby on rails 在rails 5中作为事务的回调

Ruby on rails 在rails 5中作为事务的回调,ruby-on-rails,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 5,我想在创建另一个模型记录后生成一个模型记录 基本上,我在注册控制器中调整了设计创建操作,但这并不完美。我想封装到一个事务中,以防在第二个模型创建时出现故障—第一个模型也没有创建/回滚 但似乎有一种更好的方法是在模型内部使用回调,而不是调整控制器 参考文献: , 及 虽然我甚至不确定我是否了解这个概念 我的理解是,如果我在第一个模型文件中使用after_create:create_model_2_instance,它失败了,那么创建这个模型的记录也会失败。这是两个模型的二进制结果,那么 我有点困

我想在创建另一个模型记录后生成一个模型记录

基本上,我在注册控制器中调整了设计创建操作,但这并不完美。我想封装到一个事务中,以防在第二个模型创建时出现故障—第一个模型也没有创建/回滚

但似乎有一种更好的方法是在模型内部使用回调,而不是调整控制器

参考文献: , 及

虽然我甚至不确定我是否了解这个概念

我的理解是,如果我在第一个模型文件中使用
after_create:create_model_2_instance
,它失败了,那么创建这个模型的记录也会失败。这是两个模型的二进制结果,那么

我有点困惑的是,在上一篇参考文献中,作者说:

“大多数开发人员在创建后/更新后/销毁后使用ActiveRecord回调来生成后台作业、使缓存过期等,但他们没有意识到这些回调仍然包装在数据库事务中,他们可能会得到意外的结果,如应用程序将作业排队,但记录没有创建/更新(事务回滚)。”


因此,基本上,他强制执行这样一个事实,即在创建之后,它被封装在一个事务中。假设我对一个在记录创建3小时后触发的后台作业进行排队。如果失败,原始记录将在创建3小时后销毁/回滚

是的,在将_create包装到rails中的事务中之后,所有事务都必须提交到数据库,如果其中任何一条记录无法保存到数据库中,则整个事务块将回滚


作为一种解决方法,如果您希望每个插入都是一个单独的事务,那么您可以使用after_commit回调,在该回调中,一旦事务被提交,它就不能再回滚。

是的,after_create被包装在rails中的事务中,因此所有事务都必须提交到数据库中,如果任何一条记录无法保存在数据库中,则整个事务块将回滚

作为一种解决方法,如果希望每个插入都是一个单独的事务,那么可以使用after_commit回调,在该回调中,一旦事务被提交,就不能再回滚