중고 신입이 개발해보기..

`before_save` 콜백에서 **저장 후의 값을 미리 확인하는 방법** 본문

Back-End /Ruby On Rails

`before_save` 콜백에서 **저장 후의 값을 미리 확인하는 방법**

rootkaien 2025. 3. 4. 10:45

`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`에서 변경 전후 값을 자유롭게 확인할 수 있습니다! 🚀

Comments