복잡한 조인 및 연관 관계
-
명시적 컬럼 선택:
select메서드와 SQL 문자열을 결합하여 여러 테이블에서 원하는 컬럼만 정확히 선택함으로써 쿼리 효율성을 높이고 컬럼 이름 충돌을 방지합니다. 예를 들어,PurchasedItem,Transaction,User모델에서 필요한 정보만 가져올 때 유용합니다. -
사용자 정의 조인: 모델에 정의된 기본 연관 관계를 넘어선 복잡한 조인이 필요할 경우,
joins내부에 SQL 문자열을 직접 사용하여 유연한 조인 조건을 생성할 수 있습니다.
자체 참조 연관 관계
-
동일 모델 내 관계 설정:
User모델에서manager_id를 통해 매니저와 판매 사원(sales_members) 간의 관계를 정의하여,user.manager나manager.sales_members와 같이 계층 구조를 쉽게 탐색할 수 있습니다. -
쿼리 간소화:
has_many :sales_members, class_name: 'User', foreign_key: 'manager_id'와 같은 설정을 통해 복잡한 자체 조인 쿼리를 간결하게 표현합니다. -
고려 사항: 강력하지만, 불필요한 복잡성을 야기할 수 있으므로, 필요에 따라 새로운 모델 생성을 고려하는 것이 중요합니다.
데이터베이스 특정 기능 (PostgreSQL)
-
JSON/JSONb 컬럼: PostgreSQL의 JSON 또는 JSONb 컬럼을 활용하여 유연하고 확장 가능한 스키마를 구축할 수 있습니다. 사용자 설정, 비디오 메타데이터, 웹훅 응답과 같이 동적으로 변하는 데이터를 저장하는 데 적합합니다.
-
JSON vs. JSONb:
JSONb는 이진 형태로 저장되어 고급 쿼리 및 GIN 인덱싱을 지원하며 검색 성능이 우수합니다.JSON은 문자열로 저장되어 단순 저장에 유리하나 쿼리 시 파싱이 필요합니다. 쿼리 빈도가 높다면JSONb가 효율적입니다. -
store_accessor: JSON 컬럼의 키를 명시적으로 선언하고 일반 속성처럼 접근할 수 있게 하여 코드 가독성과 유지보수성을 높입니다.
일괄 업데이트 및 삽입
-
update_all: 여러 레코드를 단일 SQL 쿼리로 업데이트하여 데이터베이스 부하를 줄이고 성능을 향상시킵니다. -
insert_all/upsert_all: Rails 6에서 도입된 기능으로, 대량의 레코드를 효율적으로 삽입하거나(insert_all) 존재하면 업데이트하고 없으면 삽입하는(upsert_all) 기능을 제공합니다. -
주의사항: 이 메서드들은 ActiveRecord 콜백이나 유효성 검사를 건너뛰므로, 이러한 로직이 필요한 경우 별도의 처리를 고려해야 합니다.