반응형
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 를 계속 할 경우 첫 테이블에 대해 다이렉트 관계를 기준으로 한다는 것을 명심해주세요
반응형
'Back-End > Ruby' 카테고리의 다른 글
Rails - 데이터 저장시에 함수 실행하기 (0) | 2024.10.17 |
---|---|
rails, ruby 역순 정렬, 변수 역순 each문 (0) | 2024.01.02 |
Rails 오류 "You have already activated... " 해결하기 (0) | 2023.09.06 |
rails i18n 하는 방법, rails 언어처리 (5분 내외) (2) | 2022.12.08 |
Rails CRUD - 데이터 저장이 잘 되었는지 확인하는 방법 (0) | 2022.10.03 |