window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = vindue if (w.LeadBooster) { console.warn('LeadBooster findes allerede') } 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 }) }, } } })() Active Record Query Interface - The Codest
Codest
  • Om os
  • Serviceydelser
    • Udvikling af software
      • Frontend-udvikling
      • Backend-udvikling
    • Staff Augmentation
      • Frontend-udviklere
      • Backend-udviklere
      • Dataingeniører
      • Cloud-ingeniører
      • QA-ingeniører
      • Andet
    • Det rådgivende
      • Revision og rådgivning
  • Industrier
    • Fintech og bankvirksomhed
    • E-commerce
    • Adtech
    • Sundhedsteknologi
    • Produktion
    • Logistik
    • Biler
    • IOT
  • Værdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leder af levering
  • Vores team
  • Casestudier
  • Ved hvordan
    • Blog
    • Møder
    • Webinarer
    • Ressourcer
Karriere Tag kontakt til os
  • Om os
  • Serviceydelser
    • Udvikling af software
      • Frontend-udvikling
      • Backend-udvikling
    • Staff Augmentation
      • Frontend-udviklere
      • Backend-udviklere
      • Dataingeniører
      • Cloud-ingeniører
      • QA-ingeniører
      • Andet
    • Det rådgivende
      • Revision og rådgivning
  • Værdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leder af levering
  • Vores team
  • Casestudier
  • Ved hvordan
    • Blog
    • Møder
    • Webinarer
    • Ressourcer
Karriere Tag kontakt til os
Pil tilbage GÅ TILBAGE
2020-06-03
Udvikling af software

Interface til forespørgsler på aktive poster

Marta Polec

Ydeevne er et af de vigtigste aspekter at tage hensyn til, når man udvikler webapplikationer. En analyse af, hvordan data hentes fra en database, er et godt udgangspunkt for at finde forbedringer. I denne artikel finder du eksempler på, hvordan du kan forbedre ydeevnen ved at bruge aggregerede funktioner og filtrere data på databaseniveau.

Lidt kontekst til at begynde med

Denne artikel er inspireret af et virkeligt problem, som jeg engang blev stillet over for. Jeg lærte meget af at håndtere det, og jeg har det stadig som en reference i mit hoved. Jeg synes, at eksempler er en god læringsressource, de kan afklare meget. I denne artikel vil jeg gerne dele nogle eksempler på brugen af Active Record-forespørgselsmetoderne med dig.

For ikke at introducere domænespecifikke detaljer vil jeg bruge et eksempel på en applikation til et bibliotek for at illustrere eksemplerne. Det hele er ret enkelt, som vist i diagrammet nedenfor. Vi har fire tabeller: forfattere, bøger, brugere og udlejning. En bruger kan låne mange bøger, og en bog kan lånes af mange brugere, så vi har brug for en sammenføjningstabel til at modellere mange-til-mange-relationer. Det er udlejningstabellen i vores tilfælde. Vi gemmer også nogle ekstra oplysninger der, som er datoerne for lån og aflevering. En forfatter kan have mange bøger tilknyttet sit navn. En bog har også en attribut, der definerer dens genre.

Statistik over brugernes læsning

Opgaven var at udarbejde statistik for en enkelt bruger, så vi kunne se, hvor mange bøger fra hver genre der var lånt. Min første tanke var at hente alle bøger, som er blevet lånt af brugeren, gruppere dem efter deres genre og derefter lave mappingen, så hver genre får tildelt et antal bøger i stedet for en liste. Her er, hvad jeg kom frem til:

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

Selv om denne tilgang fungerer og ser pæn ud, udnytter den ikke alle de muligheder, som Active Record-forespørgselsmetoderne tilbyder. Takket være dem er vi i stand til at filtrere og aggregere data på databaseniveau uden at bruge rå SQL direkte i vores Kode. At arbejde på db-niveau øger også vores effektivitet.

I eksemplet ovenfor kan vi bruge gruppemetoden i stedet for Rubys gruppeefter metode. Den vil anvende GROUPBY-klausul til tSQL-forespørgslen. Desuden kan kortlægnings- og størrelsesmetoden erstattes med en tælleaggregeringsfunktion. I sidste ende står vi tilbage med en forespørgsel, der ser sådan ud:

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

Det ser endnu mere enkelt ud!

Andre nyttige eksempler

Nedenfor finder du nogle andre måder at bruge forespørgselsmetoderne på, som jeg synes er værd at kende.

Invitation til inaktive brugere

OPGAVE: Filtrer brugere, der aldrig har lånt en bog eller har gjort det for mere end et år siden.

Vi kan hente alle brugere ved at inkludere de tilknyttede udlejninger og derefter filtrere dem ved hjælp af select-metoden.

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

Men der er selvfølgelig ingen grund til at hente alt. Ved at bruge forespørgselsmetoderne kan vi filtrere det ud på db-niveau. Lad os først vælge brugere, som har lånt nogle bøger det seneste år, og derefter udelukke dem fra det endelige udvalg.

Sådan kommer underspørgslen til at se ud:

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

Og lad os nu sætte det hele sammen:

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

Underrepræsenterede forfattere

OPGAVE: Find forfattere med en eller nul lånte bøger

Det er superenkelt at gøre det med select-metoden, men igen - der er ingen grund til at arbejde med så stort et datasæt, da db'en kan filtrere det for os:

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

Så er det hurtigt og nemt at filtrere forfattere, der ikke har fået tildelt nogen bøger:

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

Det er vigtigt at huske én ting, når man bruger left_joins (og outer joins generelt). Hvis der er poster i den venstre tabel (her: forfattere), som ikke har tilsvarende poster i den højre tabel (her: bøger), så vil kolonnerne i den højre tabel blive udfyldt med nul-værdier.

Da vi også har brug for forfattere med en bog tildelt i systemet, er der nogle flere operationer, der skal udføres. Vi skal gruppere, tælle og tilføje en betingelse. Her kan du se, hvordan vi sætter det hele sammen:

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

Betingelsen kommer efter aggregeringsfunktionen, så vi er nødt til at bruge HAVING-sætningen i stedet for WHERE-sætningen til at specificere den.

Active Record-forespørgselsmetoderne er værd at tjekke, når man tænker på applikationens ydeevne. De kan forenkle din kode og få den til at fungere hurtigere. Jeg håber, at de delte eksempler vil hjælpe dig med at udforske de muligheder, forespørgselsmetoderne har at byde på.

Læs mere om det:

– Tid til en ny virkelighed. En æra med fjernarbejde er startet for en måned siden

– Har du brug for at bruge de almindelige JS-frameworks i din Rails-app? Stimulus.js kan være et alternativ

– Udvikling af webapps: Hvorfor er Ruby on Rails en teknologi, der er værd at vælge?

Relaterede artikler

Udvikling af software

Byg fremtidssikrede webapps: Indsigt fra The Codest's ekspertteam

Oplev, hvordan The Codest udmærker sig ved at skabe skalerbare, interaktive webapplikationer med banebrydende teknologier, der leverer sømløse brugeroplevelser på tværs af alle platforme. Lær, hvordan vores ekspertise driver digital transformation og...

DENKODEST
Udvikling af software

Top 10 Letlands-baserede softwareudviklingsvirksomheder

Læs om Letlands bedste softwareudviklingsvirksomheder og deres innovative løsninger i vores seneste artikel. Find ud af, hvordan disse teknologiledere kan hjælpe med at løfte din virksomhed.

thecodest
Løsninger til virksomheder og scaleups

Grundlæggende om Java-softwareudvikling: En guide til succesfuld outsourcing

Udforsk denne vigtige guide til vellykket outsourcing af Java-softwareudvikling for at forbedre effektiviteten, få adgang til ekspertise og skabe projektsucces med The Codest.

thecodest
Udvikling af software

Den ultimative guide til outsourcing i Polen

Den voldsomme stigning i outsourcing i Polen er drevet af økonomiske, uddannelsesmæssige og teknologiske fremskridt, der fremmer it-vækst og et erhvervsvenligt klima.

TheCodest
Løsninger til virksomheder og scaleups

Den komplette guide til IT-revisionsværktøjer og -teknikker

IT-revisioner sikrer sikre, effektive og kompatible systemer. Lær mere om deres betydning ved at læse hele artiklen.

Codest
Jakub Jakubowicz CTO og medstifter

Tilmeld dig vores vidensbase, og hold dig opdateret om ekspertisen fra it-sektoren.

    Om os

    The Codest - International softwareudviklingsvirksomhed med tech-hubs i Polen.

    Storbritannien - Hovedkvarter

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokale teknologiske knudepunkter

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Hjerneambassaden, Konstruktorska
      11, 02-673 Warszawa, Polen

      Codest

    • Hjem
    • Om os
    • Serviceydelser
    • Casestudier
    • Ved hvordan
    • Karriere
    • Ordbog

      Serviceydelser

    • Det rådgivende
    • Udvikling af software
    • Backend-udvikling
    • Frontend-udvikling
    • Staff Augmentation
    • Backend-udviklere
    • Cloud-ingeniører
    • Dataingeniører
    • Andet
    • QA-ingeniører

      Ressourcer

    • Fakta og myter om at samarbejde med en ekstern softwareudviklingspartner
    • Fra USA til Europa: Hvorfor beslutter amerikanske startups sig for at flytte til Europa?
    • Sammenligning af Tech Offshore-udviklingsknudepunkter: Tech Offshore Europa (Polen), ASEAN (Filippinerne), Eurasien (Tyrkiet)
    • Hvad er de største udfordringer for CTO'er og CIO'er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Vilkår for brug af hjemmesiden

    Copyright © 2025 af The Codest. Alle rettigheder forbeholdes.

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