サーチ…


前書き

ActiveRecord Transactionsは保護ブロックです。アクティブなレコードクエリのシーケンスは、すべてが1つのアトミックアクションとして成功することができれば永続的です。

アクティブレコードトランザクションの開始

アクティブレコードトランザクションは、モデルクラスとモデルインスタンスに適用でき、トランザクションブロック内のオブジェクトはすべて同じクラスのインスタンスである必要はありません。これは、トランザクションがモデル単位ではなくデータベース単位の接続であるためです。例えば:

User.transaction do
  account.save!
  profile.save!
  print "All saves success, returning 1"
  return 1
end
rescue_from ActiveRecord::RecordInvalid do |exception|
  print "Exception thrown, transaction rolledback"
  render_error "failure", exception.record.errors.full_messages.to_sentence
end

save with a bangを使用すると、例外がスローされたときにトランザクションが自動的にロールバックされ、ロールバック後に例外のレスキューブロックに制御が移ります。 あなたが保存からスローされた例外を救助することを確認してください!トランザクションブロックで

save!を使用したくない場合は、saveが失敗したときにraise ActiveRecord::Rollback手動で発生させることができます。この例外を処理する必要はありません。トランザクションをロールバックし、トランザクションブロック後に次のステートメントに制御を移します。

   User.transaction do
      if account.save && profile.save
        print "All saves success, returning 1"
        return 1
      else
        raise ActiveRecord::Rollback
      end
    end
    print "Transaction Rolled Back"


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow