我有兩種型號: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