본문 바로가기
Back-End/Ruby

관련 데이터 필터링: Ruby on Rails에서 두 번의 조인을 활용한 방법

by Junmannn 2023. 9. 15.
반응형

 

 

A belongs_to B
B belongs_to C


의 관계를 만족하는 3개의 테이블이 있을 때에

 

A 테이블의 정보들을 가져올 때에 C 의 필드를 기준으로 필터링 하여 가져오고 싶은 경우가 있다.

 

여기서 C 의 c라는 필드의 값이 1 인 것만 가져오고싶은 경우의

 

1. 오류가 발생하는 쿼리문

2. 올바른 쿼리문

 

두 경우의 코드를 드리겠습니다

 

 

 

1. 오류가 발생하는 쿼리문

A.joins(:B).joins(:C).where('C.c = 1')

→ 첫 번째 코드 대로 한다면, A 와 C 의 다이렉트 관계를 찾아 조인을 시도해요. 하지만 B 와 C 의 관계가 명시적으로 정의가 되어있지 않았으니 Rails 는 이 관계를 인식하지 못할 수 있어요

 

 

2. 올바른 쿼리문

A.joins(:B).joins(B: :C).where(C: { c: 1 })

→ 두 번째 코드에서는 joins(B: :C)를 사용하여 명시적으로 A 모델과 C 모델 간의 관계를 설정합니다. 이렇게 하면 Rails는 관계를 정확하게 이해하고 조인을 수행할 수 있습니다.

 

 

코드는 상이할 수 있으나, 테이블 간의 join 에서는 다른 프레임 워크나 언어에서도 동일하게 작동을 할 것이니, 중분한 이해를 하고 가시면 좋겠습니다. joins joins 를 계속 할 경우 첫 테이블에 대해 다이렉트 관계를 기준으로 한다는 것을 명심해주세요

반응형