[할인코드확장 PR1] DB 마이그레이션 + 모델 — apply_scope enum + discount_code_items polymorphic
ID: eb6864dd-352e-4798-a21e-472af05f4834
## 목표
할인코드 적용 범위를 Product 전용에서 Expert::Course + Study::Course까지 확장하기 위한 DB/모델 기반 작업
## 변경 사항
### 마이그레이션 1: add_apply_scope_to_discount_codes
- discount_codes 테이블에 apply_scope string 컬럼 추가 (default: "all", null: false)
- 데이터 이관: applies_to_all: true → apply_scope: "all", false → "specific"
- applies_to_all 컬럼은 아직 제거하지 않음 (ignored_columns 먼저)
### 마이그레이션 2: create_discount_code_items
- discount_code_items 테이블 생성: discount_code_id(FK), discountable_type(string), discountable_id(uuid)
- 복합 유니크 인덱스: [discount_code_id, discountable_type, discountable_id]
- discount_code_products 데이터를 discount_code_items로 이관 (discountable_type: "Product")
### 모델
- DiscountCodeItem 모델 생성 (polymorphic belongs_to :discountable)
- DiscountCode: apply_scope enum (all/report/education/specific), ignored_columns += ["applies_to_all"]
- DiscountCode#applicable_to? 로직 변경: scope 기반
## 완료 기준
- [ ] 마이그레이션 up/down 정상 동작
- [ ] 기존 데이터 이관 정상
- [ ] DiscountCode apply_scope enum 동작
- [ ] DiscountCodeItem polymorphic 연관 동작
- [ ] 기존 테스트 전수 통과
- [ ] 새 모델 테스트 추가
## 관련 파일
- app/models/discount_code.rb
- app/models/discount_code_product.rb
- 신규: app/models/discount_code_item.rb
- test/models/discount_code_test.rb
- test/fixtures/discount_codes.yml
첨부 이미지
이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)
JPEG, PNG, GIF, WebP / 최대 10MB
활동 로그
-
팀팀리드 상태 변경: 리뷰 → 완료
2026년 04월 15일 08:37:44
-
팀팀리드 상태 변경: 진행 중 → 리뷰
2026년 04월 15일 08:12:36
-
팀팀리드 상태 변경: 백로그 → 진행 중
2026년 04월 15일 08:07:17
-
팀팀리드 기능 계획 수립 - 할인코드 적용 범위 확장
2026년 04월 15일 08:04:55
상세 보기
## 기능 개요
- 할인코드 적용 범위를 Product(report/credit_pack)에서 Expert::Course(교육프로그램) + Study::Course(온라인강좌)까지 확장
- apply_scope enum (all/report/education/specific) + polymorphic discount_code_items 조인테이블## 분석 결과
- 영향 범위: 모델 3개, 서비스 4개, 컨트롤러 3개, 뷰 2개, 마이그레이션 2개
- 기존 패턴: string enum, Result 패턴 (Data.define), Payments::CheckoutService 재사용
- 핵심: CheckoutService가 이미 discount_amount/discount_code_id 지원 → Expert 연동 간단## 생성된 티켓 (5개)
1. [할인코드확장 PR1] DB + 모델 (priority: high)
2. [할인코드확장 PR2] ValidationService (priority: high)
3. [할인코드확장 PR3] Expert/Study 서비스 (priority: high)
4. [할인코드확장 PR4] Admin UI (priority: medium)
5. [할인코드확장 PR5] 결제 UI + 정리 (priority: medium)## 리스크
- 기존 할인코드 깨짐 → ignored_columns + 기존 테스트 전수 통과로 방어
- 데이터 이관 → 마이그레이션 트랜잭션 + 롤백 검증## 기술적 결정
- applies_to_all → apply_scope string enum (프로젝트 컨벤션 일관성)
- 2단계 제거 패턴 (ignored_columns → 컬럼 삭제)
- polymorphic 조인테이블로 Product/Expert::Course/Study::Course 통합 -
팀팀리드 상태 변경: 할 일 → 백로그
2026년 04월 15일 08:04:37