我有两种型号:Person
和Address
我想在交易中创建。也就是说,我想尝试创建Person
,如果成功,请创建相关的Address
。我希望使用save
语义(返回true
或false
)而不是save!
语义(提高或不提高ActiveRecord::StatementInvalid
)。如何在ActiveRecord事务中保存(无感叹号)语义?
这并不工作,因为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
块,因为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::StatementInvalid
的transaction
块内。
我想我的第一个问题是:为什么不是这个交易区块......在两个保存上进行交易?
修复了根据需要返回true/false的代码。 – 2010-03-20 04:10:37
添加了额外的代码来回滚Person模型的变化 – 2010-03-20 04:32:17
我不确定第二个'ActiveRecord :: Rollback'在'transaction'块的外面做了什么。 – 2010-03-20 15:37:59