gpt4 book ai didi

ruby-on-rails - 如何在 ActiveRecord 事务中获得保存(无感叹号)语义?

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:22 24 4
gpt4 key购买 nike

我有两个型号:PersonAddress我想在交易中创建。也就是说,我想尝试创建 Person如果成功,则创建相关的 Address .我想使用 save语义(返回 truefalse )而不是 save!语义(是否引发 ActiveRecord::StatementInvalid)。

这不起作用,因为 user.save不会触发事务回滚:

class Person
def save_with_address(address_options = {})
transaction do
self.save
address = Address.build(address_options)
address.person = self
address.save
end
end
end

(将 self.save 调用更改为 if self.save block 周围的其余部分没有帮助,因为即使 Person 失败,Address 保存仍然成功。)

这不起作用,因为它引发了 ActiveRecord::StatementInvalid transaction 之外的异常阻止而不触发 ActiveRecord::Rollback :

class Person
def save_with_address(address_options = {})
transaction do
save!
address = Address.build(address_options)
address.person = self
address.save!
end
end
end

Rails documentation特别警告不要捕获 ActiveRecord::StatementInvalidtransaction里面 block 。

我想我的第一个问题是:为什么这个交易 block 不...在两个保存上交易?

最佳答案

这个怎么样?

class Person
def save_with_address(address_options = {})
tx_error = false
transaction do
begin
self.save!
address = Address.build(address_options)
address.person = self
address.save!
rescue Exception => e
# add relevant error message to self using errors.add_to_base
raise ActiveRecord::Rollback
tx_error = true
end
end
return true unless tx_error

# now roll back the Person TX.
raise ActiveRecord::Rollback
return false
end
end

我不喜欢 TX 的实现方式。但这是解决问题的方法。

关于ruby-on-rails - 如何在 ActiveRecord 事务中获得保存(无感叹号)语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2481806/

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