🔗
Associations (관계)
has_many, belongs_to — 모델 간 관계 설정
ActiveRecord Association은 모델 간의 관계를 Ruby 코드로 선언하는 기능입니다.
기본 관계:
class User < ApplicationRecord
has_many :posts # User 1:N Post
has_one :profile # User 1:1 Profile
end
class Post < ApplicationRecord
belongs_to :user # posts 테이블에 user_id 외래키
has_many :comments
has_many :tags, through: :post_tags # N:M 관계
end
사용:
user.posts # 해당 유저의 모든 포스트
user.posts.create(title: '...') # 관계를 통한 생성
post.user # 포스트의 작성자
옵션:
dependent: :destroy— 부모 삭제 시 자식도 삭제class_name:— 관계 클래스명 지정 (규약 외)foreign_key:— 외래키 컬럼명 지정inverse_of:— 역관계 명시
구조 다이어그램
1:N (has_many / belongs_to)
User
has_many :posts
1 ←→ N
Post
belongs_to :user
user_id 외래키
1:1 (has_one / belongs_to)
User
has_one :profile
1 ←→ 1
Profile
belongs_to :user
user_id 외래키
N:M (has_many :through)
Post
has_many :tags,
through: :post_tags
N
PostTag
post_id + tag_id
N
Tag
has_many :posts,
through: :post_tags
핵심: <strong>선언적 관계 설정</strong> → user.posts, post.user 등 메서드가 자동 생성
핵심 포인트
1
belongs_to :user — 이 모델의 테이블에 user_id 외래키가 있음을 선언
2
has_many :posts — 상대 모델이 자신의 외래키를 가지고 있음을 선언
3
has_one :profile — 1:1 관계 선언
4
has_many :tags, through: :post_tags — 중간 테이블을 통한 N:M 관계
5
dependent: :destroy 옵션으로 연쇄 삭제 설정
6
user.posts, post.user 등 메서드가 자동 생성
장점
- ✓ 선언적이라 관계가 한눈에 보임
- ✓ 관계를 통한 CRUD 메서드 자동 생성
- ✓ eager loading으로 N+1 문제 해결
- ✓ 외래키 규약으로 설정 최소화
단점
- ✗ 복잡한 관계는 코드 추적 어려움
- ✗ dependent 옵션 실수 시 데이터 손실
- ✗ polymorphic 관계는 복잡
- ✗ counter_cache 등 최적화 옵션 학습 필요
사용 사례
User-Post 1:N 관계
Post-Tag N:M 관계
User-Profile 1:1 관계
has_many :through로 복잡한 관계 표현