Khác nhau ở hai trục: có chạy validation không và thất bại thì báo bằng cách nào.
| Method | Chạy validation | Khi thất bại |
|---|---|---|
save | Có | Trả false |
save! | Có | Ném ActiveRecord::RecordInvalid |
update | Có | Trả false |
update! | Có | Ném exception |
update_attribute | Không | Bỏ qua validation, vẫn chạy callback |
update_column | Không | Bỏ qua cả callback và updated_at |
ruby
order.save # => false if invalid, you must check the return value
order.save! # => raises, good inside a transaction
order.update(status: 'paid')
order.update_column(:status, 'paid') # straight UPDATE, no validation, no callbackThực tế: trong controller dùng bản không có ! rồi rẽ nhánh render; trong transaction hoặc background job dùng bản có ! để lỗi làm rollback thay vì trôi qua âm thầm. update_attribute / update_column chỉ dùng cho cột kỹ thuật (đếm, cờ trạng thái nội bộ), không dùng cho dữ liệu do người dùng nhập.