The Codest
  • 회사 소개
  • 서비스
    • 소프트웨어 개발
      • 프론트엔드 개발
      • 백엔드 개발
    • Staff Augmentation
      • 프론트엔드 개발자
      • 백엔드 개발자
      • 데이터 엔지니어
      • 클라우드 엔지니어
      • QA 엔지니어
      • 기타
    • IT 자문
      • 감사 및 컨설팅
  • 산업 분야
    • 핀테크 및 뱅킹
    • E-commerce
    • 애드테크
    • 헬스 테크
    • 제조
    • 물류
    • 자동차
    • IOT
  • 가치
    • CEO
    • CTO
    • 배달 관리자
  • 우리 팀
  • Case Studies
  • 방법 알아보기
    • 블로그
    • 모임
    • 웹 세미나
    • 리소스
채용 정보 연락하기
  • 회사 소개
  • 서비스
    • 소프트웨어 개발
      • 프론트엔드 개발
      • 백엔드 개발
    • Staff Augmentation
      • 프론트엔드 개발자
      • 백엔드 개발자
      • 데이터 엔지니어
      • 클라우드 엔지니어
      • QA 엔지니어
      • 기타
    • IT 자문
      • 감사 및 컨설팅
  • 가치
    • CEO
    • CTO
    • 배달 관리자
  • 우리 팀
  • Case Studies
  • 방법 알아보기
    • 블로그
    • 모임
    • 웹 세미나
    • 리소스
채용 정보 연락하기
뒤로 화살표 뒤로 가기
2020-06-03
소프트웨어 개발

활성 레코드 쿼리 인터페이스

마르타 폴크

성능은 웹 애플리케이션을 개발할 때 고려해야 할 가장 중요한 측면 중 하나입니다. 데이터베이스에서 데이터를 가져오는 방법을 분석하는 것은 개선점을 찾을 때 좋은 출발점입니다. 이 글에서는 데이터베이스 수준에서 집계 함수를 사용하고 데이터를 필터링하여 성능을 개선하는 방법에 대한 예제를 살펴봅니다.

시작하기 위한 몇 가지 컨텍스트

이 글은 제가 실제로 겪었던 문제에서 영감을 받았습니다. 그 문제를 해결하면서 많은 것을 배웠고 지금도 그 문제를 참고하고 있습니다. 사례는 좋은 학습 자료라고 생각하며 많은 것을 명확하게 해줄 수 있습니다. 이 글에서는 활성 레코드 쿼리 방법을 사용하는 몇 가지 예를 공유하고자 합니다.

도메인별 세부 사항을 소개하지 않기 위해 라이브러리용 샘플 애플리케이션을 사용하여 예시를 설명하겠습니다. 아래 다이어그램에서 볼 수 있듯이 매우 간단합니다. 저자, 도서, 사용자, 대출의 네 가지 테이블이 있습니다. 한 명의 사용자가 여러 권의 책을 빌릴 수 있고 한 권의 책을 여러 사용자가 빌릴 수 있으므로 다대다 관계를 모델링하기 위해 조인 테이블이 필요합니다. 이 경우의 조인 테이블이 바로 대여 테이블입니다. 또한 대여 및 반납 날짜와 같은 몇 가지 추가 정보도 여기에 저장합니다. 저자는 자신의 이름에 여러 권의 책을 할당할 수 있습니다. 책에는 장르를 정의하는 속성도 있습니다.

사용자 읽기 통계

이 작업은 한 명의 사용자에 대한 통계를 준비하여 각 장르에서 얼마나 많은 책을 빌렸는지 파악하는 것이었습니다. 가장 먼저 생각한 것은 사용자가 대출한 모든 책을 가져와서 장르별로 그룹화한 다음 매핑을 수행하여 각 장르에 목록이 아닌 책 수가 할당되도록 하는 것이었습니다. 제가 생각해낸 방법은 다음과 같습니다:

Hash[Book.joins(:rentals).where(rentals: { user: user }).group_by(&:genre).map { |genre, books| [genre, books.size] }]

이 접근 방식은 작동하고 깔끔해 보이지만, 액티브 레코드 쿼리 방법이 제공하는 모든 가능성을 활용하지는 못합니다. 덕분에 원시 SQL을 직접 사용하지 않고도 데이터베이스 수준에서 데이터를 필터링하고 집계할 수 있습니다. 코드. DB 수준에서 운영하면 효율성도 높아집니다.

위의 예제에서는 루비의 그룹 대신 그룹 메서드를 사용할 수 있습니다.메서드별. GROUPBY 절을 tSQL 쿼리에 추가할 수 있습니다. 또한 매핑 및 크기 메서드는 카운트 집계 함수로 대체할 수 있습니다. 결국 다음과 같은 쿼리가 남게 됩니다:

Book.joins(:rentals).where(rentals: { user: user }).group(:genre).count(:books)

훨씬 더 간단해 보입니다!

기타 유용한 예

아래에서 제가 알아두면 도움이 될 만한 다른 쿼리 방법 몇 가지를 소개합니다.

비활성 사용자를 위한 초대

작업: 책을 빌린 적이 없거나 빌린 지 1년이 지난 사용자를 필터링하세요.

관련 렌탈을 포함하여 모든 사용자를 가져온 다음 선택 방법을 사용하여 필터링할 수 있습니다.

사용자.포함(:렌탈).선택 do |사용자|
 user.rentals.empty? || user.rentals.none? { |rental| rental.start_date >= Date.today - 1.year }
end 

물론 모든 것을 가져올 필요는 없습니다. 쿼리 방법을 사용하면 DB 수준에서 필터링할 수 있습니다. 먼저 작년에 책을 빌린 적이 있는 사용자를 선택한 다음 최종 선택에서 제외해 보겠습니다.

하위 쿼리는 다음과 같이 표시됩니다:

User.joins(:rentals).where(rentals: { start_date: (Date.today - 1.year).Date.today })

이제 이 모든 것을 종합해 보겠습니다:

User.where.not(id: [User.joins(:rentals).where(rentals: { start_date: (Date.today - 1.year)..Date.today })])

과소 대표되는 저자

과제: 대출 도서가 1권 또는 0권인 저자 확보하기

선택 방법을 사용하면 매우 간단하지만, 다시 말하지만 DB에서 필터링할 수 있으므로 큰 데이터 집합에 대해 작업할 필요가 없습니다:

저자.포함(:책).선택 { |저자| 저자.책.크기 <= 1 } }

그러면 할당된 책이 0권인 저자를 빠르고 쉽게 필터링할 수 있습니다:

Author.left_joins(:books).where(books: { id: nil })

왼쪽_조인(및 일반적으로 외부 조인)을 사용할 때 한 가지 기억해야 할 중요한 사항이 있습니다. 왼쪽 테이블(여기서는 authors)에 해당하는 레코드가 오른쪽 테이블(여기서는 books)에 없는 레코드가 있는 경우 결과적으로 오른쪽 테이블 열이 nil 값으로 채워집니다.

시스템에서 하나의 책이 할당된 저자도 필요하므로 몇 가지 작업을 더 수행해야 합니다. 그룹화, 계산 및 조건 추가 작업을 수행해야 합니다. 이 모든 작업을 수행하는 방법은 다음과 같습니다:

Author.left_joins(:books).group(:id).having("count(*) <= ?", 1)

조건은 집계 함수 뒤에 오므로 이를 지정하려면 WHERE 절 대신 HAVING 절을 사용해야 합니다.

애플리케이션 성능을 고려할 때 액티브 레코드 쿼리 메서드를 확인해 볼 가치가 있습니다. 코드를 간소화하고 더 빠르게 작동하도록 만들 수 있습니다. 공유한 예제가 쿼리 메서드가 제공하는 가능성을 탐색하는 데 도움이 되길 바랍니다.

자세히 읽어보세요:

– 새로운 현실을 맞이할 시간입니다. 원격 근무의 시대가 한 달 전부터 시작되었습니다.

– Rails 앱에서 일반적인 JS 프레임워크를 사용해야 하나요? Stimulus.js가 대안이 될 수 있습니다.

– 웹 앱 개발: Ruby on Rails가 선택 가치가 있는 기술인 이유는 무엇인가요?

관련 문서

상승하는 화살표와 비용 효율성 또는 절감을 상징하는 금화가 있는 하락하는 막대 차트의 추상적인 그림. 밝은 회색 바탕에 "In Code We Trust"라는 슬로건과 함께 왼쪽 상단에 The Codest 로고가 표시됩니다.
소프트웨어 개발

제품 품질 저하 없이 개발팀을 확장하는 방법

개발팀을 확장하고 계신가요? 제품 품질을 저하시키지 않고 성장하는 방법을 알아보세요. 이 가이드에서는 확장할 시기의 징후, 팀 구조, 채용, 리더십 및 도구와 더불어 The Codest가 어떻게...

최신
소프트웨어 개발

미래 지향적인 웹 앱 구축: The Codest의 전문가 팀이 제공하는 인사이트

The Codest가 최첨단 기술로 확장 가능한 대화형 웹 애플리케이션을 제작하고 모든 플랫폼에서 원활한 사용자 경험을 제공하는 데 탁월한 성능을 발휘하는 방법을 알아보세요. Adobe의 전문성이 어떻게 디지털 혁신과 비즈니스를 촉진하는지 알아보세요...

최신
소프트웨어 개발

라트비아에 본사를 둔 10대 소프트웨어 개발 기업

최신 기사에서 라트비아 최고의 소프트웨어 개발 기업과 그들의 혁신적인 솔루션에 대해 알아보세요. 이러한 기술 리더들이 어떻게 귀사의 비즈니스를 향상시키는 데 도움을 줄 수 있는지 알아보세요.

thecodest
엔터프라이즈 및 스케일업 솔루션

Java 소프트웨어 개발 필수 사항: 성공적인 아웃소싱을 위한 가이드

The Codest로 효율성을 높이고 전문 지식을 활용하며 프로젝트 성공을 이끌 수 있는 성공적인 outsourcing Java 소프트웨어 개발에 대한 이 필수 가이드를 살펴보세요.

thecodest
소프트웨어 개발

폴란드 아웃소싱을 위한 최고의 가이드

폴란드에서 outsourcing가 급증한 것은 경제, 교육, 기술 발전으로 인한 IT 성장과 비즈니스 친화적인 환경이 조성된 덕분입니다.

더코데스트

지식창고를 구독하고 IT 분야의 전문 지식을 최신 상태로 유지하세요.

    회사 소개

    The Codest - 폴란드에 기술 허브를 둔 국제 소프트웨어 개발 회사입니다.

    영국 - 본사

    • 사무실 303B, 182-184 하이 스트리트 노스 E6 2JA
      영국 런던

    폴란드 - 현지 기술 허브

    • 파브리츠나 오피스 파크, 알레야
      포코주 18, 31-564 크라쿠프
    • 뇌 대사관, 콘스트럭터스카
      11, 02-673 바르샤바, 폴란드

      The Codest

    • 홈
    • 회사 소개
    • 서비스
    • Case Studies
    • 방법 알아보기
    • 채용 정보
    • 사전

      서비스

    • IT 자문
    • 소프트웨어 개발
    • 백엔드 개발
    • 프론트엔드 개발
    • Staff Augmentation
    • 백엔드 개발자
    • 클라우드 엔지니어
    • 데이터 엔지니어
    • 기타
    • QA 엔지니어

      리소스

    • 외부 소프트웨어 개발 파트너와의 협력에 대한 사실과 오해
    • 미국에서 유럽으로: 미국 스타트업이 유럽으로 이전을 결정하는 이유
    • 테크 오프쇼어 개발 허브 비교: 테크 오프쇼어 유럽(폴란드), 아세안(필리핀), 유라시아(터키)
    • CTO와 CIO의 주요 과제는 무엇인가요?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • 웹사이트 이용 약관

    저작권 © 2025 by The Codest. 모든 권리 보유.

    ko_KRKorean
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek ko_KRKorean