🔗

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로 복잡한 관계 표현