■ARをDBに保存する際のsaveメソッドの使い分け
【1.saveは例外を発生させない】
saveはとても簡単だが、例外を発生させない。よって、リレーションの場合や、トランザクションの場合
は困ってしまう。次の例を見てみる。(p237)
invoice = Invoice.new invoice.save an_order.invoice = invoice
見ての通り、リレーションである。子行を作成し、親行に関連付けている。しかし、ここで、子行が保存
されない場合(検証などで引っかかった場合)、ARは何も訴えない。よって、次の様にする。
invoice = Invoice.new invoice.save! an_order.invoice = invoice
これなら、子行(invoice)が保存されなかった際に例外が発生するので、何かあった時に分かる。
【2.トランザクション編(p252)】
トランザクション内のsaveはsave!を用います。そうでないと、そこで異常があった際に、トランザクションが
効かないからです。
def withdraw(amount) adjust_balance_and_save(-amount) end private def adjust_balance_and_save(amount) self.balance += amount save! end