保存失败时的 rails 回调

A F*_*kly 1 ruby activerecord ruby-on-rails ruby-on-rails-5

在 Rails 5 中,我实现了一系列关系,这些关系在保存一个复杂模型时会导致鸡与蛋的问题。(需要 ID 来关联对象,但直到它们被保存后才存在。)

我需要以艰难的方式创建和保存对象,但如果保存失败,我需要自己清理,所以我最终不会得到一个充满空对象的数据库。

从模型中,当且仅当保存失败时,我如何确保我的清理代码运行?标准的回调列表似乎没有涵盖这种情况,除非我遗漏了一些东西。

max*_*max 5

模型回调是 Rails 中最被过度使用和误用的功能之一。它们非常适合在模型的生命周期中添加简单的回调,但很难控制它们何时被触发(例如在您的测试中它们会减慢一切)或进入流程以添加应用程序逻辑。

如果您的回调比定义回调的模型影响更大,那么这是一个非常好的迹象,您应该重新考虑使用回调。

在这种情况下,您最可能想要的是交易

A.transaction do 
   begin 
     a = A.create!(some_params)
     a.bs.create!(some_other_params)
   rescue ActiveRecord::RecordInvalid
     a
   end
end
Run Code Online (Sandbox Code Playgroud)

这将操作包装在一个数据库事务中,如果任一操作失败,该事务将回滚 - 保持数据库不变。

您可以将其内联在控制器中或将其包装在服务对象中

  • *“模型回调是 Rails 中最被过度使用和滥用的功能之一。”* 这整天都是这样!你赢得了互联网。 (2认同)