saveとsave!

■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