Correct tired coding
Rails docs say with_lock wraps the item in a transaction which won't pass the rollback up the chain, using lock! instead as we're already in a transaction so it should honour the rollback call
Handle cancelling an order that bought gift_cards destroying them, and cancelling an order bought WITH gift_cards crediting the balance back
pre_save for setting up self, post-save for calls to other models (incase they reference self)