window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster już istnieje') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Interfejs Active Record Query - The Codest
The Codest
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Branże
    • Fintech i bankowość
    • E-commerce
    • Adtech
    • Healthtech
    • Produkcja
    • Logistyka
    • Motoryzacja
    • IOT
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
Strzałka w tył WSTECZ
2020-06-03
Software Development

Interfejs Active Record Query

Marta Polec

Wydajność jest jednym z najważniejszych aspektów, które należy wziąć pod uwagę podczas tworzenia aplikacji internetowych. Analiza sposobu pobierania danych z bazy danych jest dobrym punktem wyjścia przy poszukiwaniu ulepszeń. W tym artykule znajdziesz przykłady, jak poprawić wydajność za pomocą funkcji agregujących i filtrowania danych na poziomie bazy danych.

Na początek trochę kontekstu

Ten artykuł został zainspirowany prawdziwym problemem, z którym miałem kiedyś do czynienia. Poradzenie sobie z nim wiele mnie nauczyło i wciąż mam go w pamięci. Uważam, że przykłady są dobrym źródłem wiedzy i mogą wiele wyjaśnić. W tym artykule chciałbym podzielić się z wami kilkoma przykładami użycia metod zapytań Active Record.

Aby nie wprowadzać szczegółów specyficznych dla domeny, użyję przykładowej aplikacji dla biblioteki, aby zilustrować przykłady. Wszystko jest dość proste, jak pokazano na poniższym diagramie. Mamy cztery tabele: autorzy, książki, użytkownicy i wypożyczenia. Jeden użytkownik może wypożyczyć wiele książek, a jedna książka może być wypożyczona przez wielu użytkowników, więc potrzebujemy tabeli łączącej, aby modelować relacje wiele do wielu. W naszym przypadku jest to tabela wypożyczeń. Przechowujemy tam również dodatkowe informacje, takie jak daty wypożyczenia i zwrotu. Autor może mieć wiele książek przypisanych do swojego nazwiska. Książka ma również atrybut określający jej gatunek.

Statystyki odczytu użytkowników

Zadanie polegało na przygotowaniu statystyk dla pojedynczego użytkownika, abyśmy mogli określić, ile książek z każdego gatunku zostało wypożyczonych. Moim pierwszym pomysłem było pobranie wszystkich książek, które zostały wypożyczone przez użytkownika, pogrupowanie ich według gatunku, a następnie wykonanie mapowania, tak aby każdy gatunek miał przypisaną liczbę książek zamiast listy. Oto co wymyśliłem:

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

Chociaż to podejście działa i wygląda czysto, nie wykorzystuje wszystkich możliwości, jakie oferują metody zapytań Active Record. Dzięki nim, jesteśmy w stanie filtrować i agregować dane na poziomie bazy danych bez użycia surowego SQL bezpośrednio w naszej aplikacji kod. Działanie na poziomie db zwiększa również naszą wydajność.

W powyższym przykładzie możemy użyć metody group zamiast grupy Rubiegowedług metody. Zastosuje ona GROUPBY do zapytania tSQL. Ponadto metodę mapowania i rozmiaru można zastąpić funkcją agregacji liczby. Ostatecznie otrzymujemy zapytanie, które wygląda następująco:

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

Wygląda to jeszcze prościej!

Inne przydatne przykłady

Poniżej znajdziesz kilka innych sposobów korzystania z metod zapytań, które moim zdaniem warto znać.

Zaproszenie dla nieaktywnych użytkowników

ZADANIE: Odfiltrować użytkowników, którzy nigdy nie wypożyczyli książki lub zrobili to ponad rok temu.

Moglibyśmy pobrać wszystkich użytkowników z uwzględnieniem powiązanych wypożyczalni, a następnie przefiltrować ich za pomocą metody select.

User.includes(:rentals).select do |user|
 user.rentals.empty? | user.rentals.none? { |rental| rental.start_date >= Date.today - 1.year }
end 

Ale oczywiście nie ma potrzeby pobierania wszystkiego. Korzystając z metod zapytań, możemy odfiltrować je na poziomie bazy danych. Najpierw wybierzmy użytkowników, którzy wypożyczyli jakieś książki w ciągu ostatniego roku, a następnie wykluczmy ich z ostatecznej selekcji.

Tak będzie wyglądać podzapytanie:

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

A teraz połączmy to wszystko razem:

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

Autorzy niedostatecznie reprezentowani

ZADANIE: Zdobądź autorów z jedną lub zerową liczbą wypożyczonych książek

Zrobienie tego za pomocą metody select jest super proste, ale znowu - nie ma potrzeby operowania na tak dużym zestawie danych, ponieważ db może je przefiltrować za nas:

Author.includes(:books).select { |author| author.books.size <= 1 }

Następnie filtrowanie autorów z zerową liczbą przypisanych książek jest szybkie i łatwe:

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

Ważne jest, aby pamiętać o jednej rzeczy podczas korzystania z złączeń left_joins (i ogólnie złączeń zewnętrznych). Jeśli istnieją rekordy w lewej tabeli (tutaj: autorzy), które nie mają odpowiadających im rekordów w prawej tabeli (tutaj: książki), to w rezultacie kolumny prawej tabeli zostaną wypełnione wartościami zerowymi.

Ponieważ potrzebujemy również autorów z jedną książką przypisaną w systemie, jest jeszcze kilka operacji do wykonania. Będziemy musieli wykonać grupowanie, liczenie i dodanie warunku. Oto jak to wszystko połączyć:

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

Warunek pojawia się po funkcji agregacji, więc musimy użyć klauzuli HAVING zamiast klauzuli WHERE, aby go określić.

Metody zapytań Active Record są warte sprawdzenia, gdy myślimy o wydajności aplikacji. Mogą one uprościć kod i sprawić, że będzie on działał szybciej. Mam nadzieję, że udostępnione przykłady pomogą ci w odkrywaniu możliwości, jakie oferują metody zapytań.

Czytaj więcej:

– Czas na nową rzeczywistość. Miesiąc temu rozpoczęła się era pracy zdalnej

– Potrzebujesz użyć popularnych frameworków JS w swojej aplikacji Rails? Stimulus.js może być alternatywą

– Tworzenie aplikacji internetowych: Dlaczego warto wybrać technologię Ruby on Rails?

Powiązane artykuły

Software Development

Tworzenie przyszłościowych aplikacji internetowych: spostrzeżenia zespołu ekspertów The Codest

Odkryj, w jaki sposób The Codest wyróżnia się w tworzeniu skalowalnych, interaktywnych aplikacji internetowych przy użyciu najnowocześniejszych technologii, zapewniając płynne doświadczenia użytkowników na wszystkich platformach. Dowiedz się, w jaki sposób nasza wiedza napędza transformację cyfrową i biznes...

THEECODEST
Software Development

10 najlepszych firm tworzących oprogramowanie na Łotwie

Dowiedz się więcej o najlepszych łotewskich firmach programistycznych i ich innowacyjnych rozwiązaniach w naszym najnowszym artykule. Odkryj, w jaki sposób ci liderzy technologiczni mogą pomóc w rozwoju Twojej firmy.

thecodest
Rozwiązania dla przedsiębiorstw i scaleupów

Podstawy tworzenia oprogramowania Java: Przewodnik po skutecznym outsourcingu

Zapoznaj się z tym niezbędnym przewodnikiem na temat skutecznego tworzenia oprogramowania Java outsourcing, aby zwiększyć wydajność, uzyskać dostęp do wiedzy specjalistycznej i osiągnąć sukces projektu z The Codest.

thecodest
Software Development

Kompletny przewodnik po outsourcingu w Polsce

Wzrost liczby outsourcing w Polsce jest napędzany przez postęp gospodarczy, edukacyjny i technologiczny, sprzyjający rozwojowi IT i przyjazny klimat dla biznesu.

TheCodest
Rozwiązania dla przedsiębiorstw i scaleupów

Kompletny przewodnik po narzędziach i technikach audytu IT

Audyty IT zapewniają bezpieczne, wydajne i zgodne z przepisami systemy. Dowiedz się więcej o ich znaczeniu, czytając cały artykuł.

The Codest
Jakub Jakubowicz CTO & Współzałożyciel

Subskrybuj naszą bazę wiedzy i bądź na bieżąco!

    O nas

    The Codest - Międzynarodowa firma programistyczna z centrami technologicznymi w Polsce.

    Wielka Brytania - siedziba główna

    • Office 303B, 182-184 High Street North E6 2JA
      Londyn, Anglia

    Polska - lokalne centra technologiczne

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polska

      The Codest

    • Strona główna
    • O nas
    • Nasze Usługi
    • Case Studies
    • Nasze Know How
    • Kariera
    • Słownik

      Nasze Usługi

    • Konsultacje IT
    • Software Development
    • Backend Development
    • Frontend Development
    • Zespoły IT
    • Backend Dev
    • Inżynierowie rozwiązań chmurowych
    • Inżynierowie danych
    • Inne
    • Inżynierowie QA

      Raporty

    • Fakty i mity na temat współpracy z zewnętrznym partnerem programistycznym
    • Z USA do Europy: Dlaczego amerykańskie startupy decydują się na relokację do Europy?
    • Porównanie centrów rozwoju Tech Offshore: Tech Offshore Europa (Polska), ASEAN (Filipiny), Eurazja (Turcja)
    • Jakie są największe wyzwania CTO i CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Warunki korzystania z witryny

    Copyright © 2025 by The Codest. Wszelkie prawa zastrzeżone.

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