A F*_*kly 1 ruby activerecord ruby-on-rails ruby-on-rails-5
在 Rails 5 中,我实现了一系列关系,这些关系在保存一个复杂模型时会导致鸡与蛋的问题。(需要 ID 来关联对象,但直到它们被保存后才存在。)
我需要以艰难的方式创建和保存对象,但如果保存失败,我需要自己清理,所以我最终不会得到一个充满空对象的数据库。
从模型中,当且仅当保存失败时,我如何确保我的清理代码运行?标准的回调列表似乎没有涵盖这种情况,除非我遗漏了一些东西。
模型回调是 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)
这将操作包装在一个数据库事务中,如果任一操作失败,该事务将回滚 - 保持数据库不变。
您可以将其内联在控制器中或将其包装在服务对象中。
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |