The Codest
  • O nás
  • Služby
    • Vývoj softwaru
      • Vývoj frontendů
      • Vývoj backendu
    • Staff Augmentation
      • Vývojáři frontendů
      • Vývojáři backendu
      • Datoví inženýři
      • Cloudoví inženýři
      • Inženýři QA
      • Další
    • To Advisory
      • Audit a poradenství
  • Odvětví
    • Fintech a bankovnictví
    • E-commerce
    • Adtech
    • Healthtech
    • Výroba
    • Logistika
    • Automobilový průmysl
    • IOT
  • Hodnota za
    • CEO
    • CTO
    • Manažer dodávek
  • Náš tým
  • Case Studies
  • Vědět jak
    • Blog
    • Setkání
    • Webové semináře
    • Zdroje
Kariéra Spojte se s námi
  • O nás
  • Služby
    • Vývoj softwaru
      • Vývoj frontendů
      • Vývoj backendu
    • Staff Augmentation
      • Vývojáři frontendů
      • Vývojáři backendu
      • Datoví inženýři
      • Cloudoví inženýři
      • Inženýři QA
      • Další
    • To Advisory
      • Audit a poradenství
  • Hodnota za
    • CEO
    • CTO
    • Manažer dodávek
  • Náš tým
  • Case Studies
  • Vědět jak
    • Blog
    • Setkání
    • Webové semináře
    • Zdroje
Kariéra Spojte se s námi
Šipka zpět ZPĚT
2020-06-03
Vývoj softwaru

Rozhraní pro dotazování aktivních záznamů

Marta Polec

Výkon je jedním z nejdůležitějších aspektů, které je třeba brát v úvahu při vývoji webových aplikací. Analýza způsobu načítání dat z databáze je dobrým výchozím bodem při hledání vylepšení. V tomto článku najdete příklady, jak zlepšit výkon pomocí agregačních funkcí a filtrování dat na úrovni databáze.

Pro začátek několik souvislostí

Tento článek je inspirován skutečným problémem, který jsem kdysi řešil. Jeho řešení mě hodně naučilo a stále ho mám v paměti jako referenci. Myslím, že příklady jsou dobrým zdrojem učení, mohou mnohé objasnit. V tomto článku bych se s vámi rád podělil o několik příkladů použití dotazovacích metod Active Record.

Abych nezaváděl podrobnosti specifické pro danou doménu, použiji pro ilustraci příkladů ukázkovou aplikaci pro knihovnu. Vše je poměrně jednoduché, jak ukazuje následující schéma. Máme čtyři tabulky: autoři, knihy, uživatelé a výpůjčky. Jeden uživatel si může vypůjčit mnoho knih a jednu knihu si může vypůjčit mnoho uživatelů, takže potřebujeme spojovací tabulku pro modelování vztahů mnoho-více. V našem případě je to tabulka pronájmy. V ní také ukládáme některé další informace, kterými jsou data výpůjček a vrácení. Autor může mít ke svému jménu přiřazeno mnoho knih. Kniha má také atribut definující její žánr.

Statistiky čtení uživatelů

Úkolem bylo připravit statistiku pro jednoho uživatele, abychom mohli zjistit, kolik knih z jednotlivých žánrů si vypůjčil. Nejdříve mě napadlo načíst všechny knihy, které si uživatel vypůjčil, seskupit je podle žánru a pak provést mapování, takže každý žánr bude mít místo seznamu přiřazený počet knih. Zde je to, co jsem vymyslel:

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

Tento přístup sice funguje a vypadá čistě, ale nevyužívá všechny možnosti, které nabízejí metody dotazování Active Record. Díky nim jsme schopni filtrovat a agregovat data na úrovni databáze, aniž bychom museli používat surové SQL přímo v našem kód. Provoz na úrovni db také zvyšuje naši efektivitu.

Ve výše uvedeném příkladu můžeme použít metodu group namísto metody group v jazyce Ruby.metodou. Bude použita skupina GROUPklauzuli BY do dotazu tSQL. Dále lze metodu mapování a velikost nahradit agregační funkcí pro počítání. Nakonec nám zůstane dotaz, který vypadá takto:

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

Vypadá to ještě jednodušeji!

Další užitečné příklady

Níže najdete několik dalších způsobů použití dotazovacích metod, které považuji za užitečné.

Pozvánka pro neaktivní uživatele

ÚKOL: Vyfiltrujte uživatele, kteří si nikdy nepůjčili knihu nebo tak učinili před více než rokem.

Mohli bychom získat všechny uživatele včetně přidružených pronájmů a poté je filtrovat pomocí metody select.

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

Samozřejmě však není nutné přebírat všechno. Pomocí metod dotazování je můžeme vyfiltrovat na úrovni db. Nejprve vybereme uživatele, kteří si v posledním roce vypůjčili nějaké knihy, a ty pak z konečného výběru vyloučíme.

Takto bude vypadat poddotaz:

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

A teď si to všechno spojíme dohromady:

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

Nedostatečně zastoupení autoři

Úkol: Získat autory s jednou nebo nulou vypůjčených knih

Provedení pomocí metody select je velmi jednoduché, ale opět - není třeba pracovat s tak velkou množinou dat, protože db je může filtrovat. nás:

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

Filtrování autorů s nulovým počtem přiřazených knih je pak snadné a rychlé:

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

Při používání left_joins (a vnějších spojů obecně) je důležité pamatovat na jednu věc. Pokud jsou v levé tabulce (zde: autoři) záznamy, které nemají odpovídající záznamy v pravé tabulce (zde: knihy), pak budou ve výsledku sloupce pravé tabulky vyplněny nulovými hodnotami.

Protože v systému potřebujeme také autory s jednou přiřazenou knihou, je třeba provést ještě několik dalších operací. Budeme muset provést seskupování, počítání a přidání podmínky. Zde je návod, jak to všechno dát dohromady:

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

Podmínka se objevuje až za agregační funkcí, takže ji musíme zadat pomocí klauzule HAVING namísto klauzule WHERE.

Při přemýšlení o výkonu aplikace stojí za to zkontrolovat metody dotazování Active Record. Mohou zjednodušit váš kód a zrychlit jeho práci. Doufám, že vám sdílené příklady pomohou při zkoumání možností, které dotazovací metody nabízejí.

Přečtěte si více:

– Je čas na novou realitu. Před měsícem začala éra práce na dálku

– Potřebujete ve své aplikaci Rails používat běžné rámce JS? Alternativou může být Stimulus.js

– Vývoj webových aplikací: Proč se vyplatí zvolit technologii Ruby on Rails?

Související články

Ilustrace zdravotnické aplikace pro chytré telefony s ikonou srdce a rostoucím zdravotním grafem, označená logem The Codest, která představuje digitální zdraví a řešení HealthTech.
Vývoj softwaru

Softwarové vybavení pro zdravotnictví: a případy použití

Nástroje, na které se dnes zdravotnické organizace spoléhají, se v ničem nepodobají papírovým kartám z doby před desítkami let. zdravotnický software dnes podporuje zdravotnické systémy, péči o pacienty a moderní poskytování zdravotní péče v klinických a...

NEJKRÁSNĚJŠÍ
Abstraktní ilustrace klesajícího sloupcového grafu se stoupající šipkou a zlatou mincí symbolizující efektivitu nákladů nebo úspory. V levém horním rohu se zobrazuje logo The Codest se sloganem "In Code We Trust" na světle šedém pozadí.
Vývoj softwaru

Jak rozšířit tým vývojářů bez ztráty kvality produktu

Zvětšujete svůj vývojový tým? Zjistěte, jak růst, aniž byste museli obětovat kvalitu produktu. Tento průvodce se zabývá příznaky, že je čas na škálování, strukturou týmu, najímáním zaměstnanců, vedením a nástroji - a také tím, jak může The Codest...

NEJKRÁSNĚJŠÍ
Vývoj softwaru

Vytváření webových aplikací odolných vůči budoucnosti: postřehy týmu odborníků The Codest

Zjistěte, jak společnost The Codest vyniká při vytváření škálovatelných, interaktivních webových aplikací pomocí nejmodernějších technologií, které poskytují bezproblémové uživatelské prostředí na všech platformách. Zjistěte, jak naše odborné znalosti podporují digitální transformaci a obchodní...

NEJKRÁSNĚJŠÍ
Vývoj softwaru

10 nejlepších lotyšských společností zabývajících se vývojem softwaru

V našem nejnovějším článku se dozvíte o nejlepších lotyšských společnostech zabývajících se vývojem softwaru a jejich inovativních řešeních. Zjistěte, jak mohou tito technologičtí lídři pomoci pozvednout vaše podnikání.

thecodest
Podniková a škálovací řešení

Základy vývoje softwaru v jazyce Java: A Guide to Outsourcing Successfully

Prozkoumejte tuto základní příručku o úspěšném vývoji softwaru outsourcing Java, abyste zvýšili efektivitu, získali přístup k odborným znalostem a dosáhli úspěchu projektu s The Codest.

thecodest

Přihlaste se k odběru naší znalostní databáze a získejte aktuální informace o odborných znalostech z oblasti IT.

    O nás

    The Codest - Mezinárodní společnost zabývající se vývojem softwaru s technologickými centry v Polsku.

    Spojené království - ústředí

    • Kancelář 303B, 182-184 High Street North E6 2JA
      Londýn, Anglie

    Polsko - Místní technologická centra

    • Kancelářský park Fabryczna, Aleja
      Pokoju 18, 31-564 Krakov
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšava, Polsko

      The Codest

    • Home
    • O nás
    • Služby
    • Case Studies
    • Vědět jak
    • Kariéra
    • Slovník

      Služby

    • To Advisory
    • Vývoj softwaru
    • Vývoj backendu
    • Vývoj frontendů
    • Staff Augmentation
    • Vývojáři backendu
    • Cloudoví inženýři
    • Datoví inženýři
    • Další
    • Inženýři QA

      Zdroje

    • Fakta a mýty o spolupráci s externím partnerem pro vývoj softwaru
    • Z USA do Evropy: Proč se americké startupy rozhodly přesídlit do Evropy?
    • Srovnání technických vývojových center v zahraničí: Tech Offshore Evropa (Polsko), ASEAN (Filipíny), Eurasie (Turecko)
    • Jaké jsou hlavní výzvy CTO a CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Copyright © 2026 by The Codest. Všechna práva vyhrazena.

    cs_CZCzech
    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 pt_PTPortuguese cs_CZCzech