`before_save` 콜백에서 **저장 후의 값을 미리 확인하는 방법**은 해당 속성이 `변경될 예정인 값`을 포함하고 있기 때문에 단순히 `self.attribute_name`을 조회하면 됩니다.
하지만 변경 전의 값이 필요하다면 `attribute_was` 또는 `changes` 메서드를 사용해야 합니다.
---
## **🚀 변경 전후 값 확인하는 방법**
### **1. `self.attribute_name` (변경 후 값)**
- `before_save`에서 `self.attribute_name`을 조회하면 **저장될 값(변경 후 값)**이 나옵니다.
```ruby
class User < ApplicationRecord
before_save :check_role_change
private
def check_role_change
puts "변경 후 role: #{self.role}" # 변경된 값 (새로운 값)
end
end
```
✅ **설명**
- `self.role`은 **저장될 값**(변경 후 값)을 의미합니다.
- 즉, `before_save`가 실행될 때 `self.role`을 확인하면 **새로운 값**을 볼 수 있습니다.
---
### **2. `attribute_was` (변경 전 값)**
- `attribute_was`는 저장되기 **직전의 기존 값(변경 전 값)**을 반환합니다.
```ruby
class User < ApplicationRecord
before_save :check_role_change
private
def check_role_change
puts "변경 전 role: #{role_was}" # 기존 값 (이전 값)
puts "변경 후 role: #{role}" # 변경될 값 (새로운 값)
end
end
```
✅ **설명**
- `role_was` → 변경 전 값
- `self.role` → 변경 후 값
---
### **3. `changes` (변경 내역 해시)**
- `changes`는 **변경된 속성들의 해시값을 반환**하며, `[이전 값, 이후 값]` 형식으로 저장됩니다.
```ruby
class User < ApplicationRecord
before_save :check_role_change
private
def check_role_change
if changes[:role]
old_value, new_value = changes[:role]
puts "변경 전 role: #{old_value}"
puts "변경 후 role: #{new_value}"
end
end
end
```
✅ **설명**
- `changes[:role]` → `[변경 전 값, 변경 후 값]` 형태의 배열을 반환
- `old_value` → 기존 값 (변경 전)
- `new_value` → 새로운 값 (변경 후)
---
## **🚀 정리**
| 방법 | 설명 | 예제 |
|------|------|------|
| `self.attribute_name` | 변경 후 값 | `self.role` |
| `attribute_was` | 변경 전 값 | `role_was` |
| `changes[:attribute]` | 변경 내역 `[이전 값, 이후 값]` | `changes[:role]` |
**✅ 추천 사용법**
- **변경 후 값만 알고 싶다면?** → `self.attribute_name`
- **변경 전 값을 알고 싶다면?** → `attribute_was`
- **변경 내역을 비교하고 싶다면?** → `changes[:attribute]`
이제 `before_save`에서 변경 전후 값을 자유롭게 확인할 수 있습니다! 🚀