gpt4 book ai didi

ruby-on-rails - 保存失败时的 rails 回调

转载 作者:太空宇宙 更新时间:2023-11-03 17:43:10 24 4
gpt4 key购买 nike

在 Rails 5 中,我实现了一系列关系,这些关系在保存一个复杂模型时会导致先有鸡还是先有蛋的问题。 (需要 ID 来关联对象,但在保存之前不存在。)

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

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

最佳答案

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

如果您的回调比定义回调的模型产生的影响更大,这是一个很好的迹象,表明您应该重新考虑使用回调。

在这种情况下,您最有可能想要的是 transaction :

A.transaction do 
begin
a = A.create!(some_params)
a.bs.create!(some_other_params)
rescue ActiveRecord::RecordInvalid
a
end
end

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

您可以将其内联到 Controller 中或将其包装在 service object 中.

关于ruby-on-rails - 保存失败时的 rails 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50743378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com