window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versjon: 2, } ;(function () { var w = vindu if (w.LeadBooster) { console.warn('LeadBooster finnes 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 }) }, } } })() Grensesnitt for aktive registerforespørsler - The Codest
The Codest
  • Om oss
  • Tjenester
    • Programvareutvikling
      • Frontend-utvikling
      • Backend-utvikling
    • Staff Augmentation
      • Frontend-utviklere
      • Backend-utviklere
      • Dataingeniører
      • Ingeniører i skyen
      • QA-ingeniører
      • Annet
    • Det rådgivende
      • Revisjon og rådgivning
  • Industrier
    • Fintech og bankvirksomhet
    • E-commerce
    • Adtech
    • Helseteknologi
    • Produksjon
    • Logistikk
    • Bilindustrien
    • IOT
  • Verdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leveransesjef
  • Vårt team
  • Casestudier
  • Vet hvordan
    • Blogg
    • Møter
    • Webinarer
    • Ressurser
Karriere Ta kontakt med oss
  • Om oss
  • Tjenester
    • Programvareutvikling
      • Frontend-utvikling
      • Backend-utvikling
    • Staff Augmentation
      • Frontend-utviklere
      • Backend-utviklere
      • Dataingeniører
      • Ingeniører i skyen
      • QA-ingeniører
      • Annet
    • Det rådgivende
      • Revisjon og rådgivning
  • Verdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leveransesjef
  • Vårt team
  • Casestudier
  • Vet hvordan
    • Blogg
    • Møter
    • Webinarer
    • Ressurser
Karriere Ta kontakt med oss
Pil tilbake GÅ TILBAKE
2020-06-03
Programvareutvikling

Active Record Query-grensesnitt

Marta Polec

Ytelse er et av de viktigste aspektene å ta hensyn til når man utvikler webapplikasjoner. Å analysere hvordan data hentes fra en database, er et godt utgangspunkt for å finne forbedringer. I denne artikkelen finner du eksempler på hvordan du kan forbedre ytelsen ved å bruke aggregerte funksjoner og filtrere data på databasenivå.

Litt kontekst til å begynne med

Denne artikkelen er inspirert av et reelt problem jeg en gang fikk i oppgave å løse. Jeg lærte mye av det, og jeg har det fortsatt som en referanse i tankene mine. Jeg synes eksempler er en god læringsressurs, de kan avklare mye. I denne artikkelen vil jeg gi deg noen eksempler på hvordan du kan bruke spørringsmetodene i Active Record.

For ikke å introdusere domenespesifikke detaljer, vil jeg bruke en eksempelapplikasjon for et bibliotek for å illustrere eksempler. Det hele er ganske enkelt, som vist i diagrammet nedenfor. Vi har fire tabeller: forfattere, bøker, brukere og utleie. Én bruker kan låne mange bøker, og én bok kan lånes av mange brukere, så vi trenger en sammenføyningstabell for å modellere mange-til-mange-relasjoner. I vårt tilfelle er det utleietabellen. Vi lagrer også noe tilleggsinformasjon der, nemlig datoene for lån og tilbakelevering. En forfatter kan ha mange bøker knyttet til navnet sitt. En bok har også et attributt som definerer sjangeren.

Statistikk over brukerlesing

Oppgaven var å utarbeide statistikk for en enkelt bruker, slik at vi kunne se hvor mange bøker fra hver sjanger som var lånt. Min første tanke var å hente alle bøkene som har blitt lånt av brukeren, gruppere dem etter sjanger og deretter gjøre mappingen, slik at hver sjanger får et antall bøker tildelt i stedet for en liste. Her er hva jeg kom frem til:

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

Selv om denne tilnærmingen fungerer og ser ryddig ut, utnytter den ikke alle mulighetene som spørringsmetodene i Active Record tilbyr. Takket være dem kan vi filtrere og aggregere data på databasenivå uten å bruke rå SQL direkte i kode. Å operere på db-nivå øker også effektiviteten vår.

I eksempelet ovenfor kan vi bruke group-metoden i stedet for Rubys groupetter metode. Den vil bruke GROUPBY-klausulen til tSQL-spørringen. Videre kan kartleggings- og størrelsesmetoden erstattes med en telleaggregeringsfunksjon. Til slutt sitter vi igjen med en spørring som ser slik ut:

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

Det ser enda enklere ut!

Andre nyttige eksempler

Nedenfor finner du noen andre måter å bruke spørringsmetodene på som jeg synes er verdt å kjenne til.

Invitasjon til inaktive brukere

OPPGAVE: Filtrer brukere som aldri har lånt en bok eller gjorde det for mer enn ett år siden.

Vi kan hente alle brukere ved å inkludere de tilknyttede leieobjektene og deretter filtrere dem ved hjelp av select-metoden.

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

Men det er selvfølgelig ikke nødvendig å hente alt. Ved å bruke spørringsmetodene kan vi filtrere det ut på db-nivå. La oss først velge ut brukere som har lånt noen bøker det siste året, og deretter ekskludere dem fra det endelige utvalget.

Slik vil underspørsmålet se ut:

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

Og nå, la oss sette det hele sammen:

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

Underrepresenterte forfattere

OPPGAVE: Skaff forfattere med én eller null lånte bøker

Det er superenkelt å gjøre det med select-metoden, men igjen - det er ikke nødvendig å operere på et så stort sett med data, ettersom db-en kan filtrere det for oss:

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

Da er det raskt og enkelt å filtrere forfattere som ikke har fått tildelt noen bøker:

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

Det er viktig å huske én ting når du bruker left_joins (og outer joins generelt). Hvis det finnes poster i den venstre tabellen (her: forfattere) som ikke har tilsvarende poster i den høyre tabellen (her: bøker), vil kolonnene i den høyre tabellen bli fylt ut med nullverdier.

Siden vi også trenger forfattere med én bok tildelt i systemet, er det noen flere operasjoner som må gjøres. Vi må gruppere, telle og legge til en betingelse. Slik setter vi det hele sammen:

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

Betingelsen kommer etter aggregeringsfunksjonen, så vi må bruke HAVING-klausulen i stedet for WHERE-klausulen for å spesifisere den.

Active Record-spørringsmetodene er verdt å sjekke når du tenker på applikasjonens ytelse. De kan forenkle koden din og få den til å fungere raskere. Jeg håper at eksemplene i denne artikkelen vil hjelpe deg med å utforske mulighetene spørringsmetodene har å by på.

Les mer om dette:

– Tid for en ny virkelighet. En æra med fjernarbeid har startet for en måned siden

– Trenger du å bruke de vanligste JS-rammeverkene i Rails-appen din? Stimulus.js kan være et alternativ

– Utvikling av webapplikasjoner: Hvorfor er Ruby on Rails en teknologi det er verdt å velge?

Relaterte artikler

Programvareutvikling

Bygg fremtidssikre webapper: Innsikt fra The Codests ekspertteam

Oppdag hvordan The Codest utmerker seg når det gjelder å skape skalerbare, interaktive webapplikasjoner med banebrytende teknologi som gir sømløse brukeropplevelser på tvers av alle plattformer. Finn ut hvordan ekspertisen vår driver digital transformasjon og...

THECODEST
Programvareutvikling

Topp 10 Latvia-baserte programvareutviklingsselskaper

I vår nyeste artikkel kan du lese mer om Latvias beste programvareutviklingsselskaper og deres innovative løsninger. Oppdag hvordan disse teknologilederne kan bidra til å løfte virksomheten din.

thecodest
Løsninger for bedrifter og oppskalering

Grunnleggende om Java-programvareutvikling: En guide til vellykket outsourcing

Utforsk denne viktige veiledningen om vellykket outsourcing av Java-programvareutvikling for å øke effektiviteten, få tilgang til ekspertise og drive frem prosjektsuksess med The Codest.

thecodest
Programvareutvikling

Den ultimate guiden til outsourcing i Polen

Den kraftige økningen i outsourcing i Polen er drevet av økonomiske, utdanningsmessige og teknologiske fremskritt, noe som fremmer IT-vekst og et forretningsvennlig klima.

TheCodest
Løsninger for bedrifter og oppskalering

Den komplette guiden til verktøy og teknikker for IT-revisjon

IT-revisjoner sørger for sikre, effektive og kompatible systemer. Les hele artikkelen for å lære mer om viktigheten av dem.

The Codest
Jakub Jakubowicz CTO og medgrunnlegger

Abonner på vår kunnskapsbase og hold deg oppdatert på ekspertisen fra IT-sektoren.

    Om oss

    The Codest - Internasjonalt programvareutviklingsselskap med teknologisentre i Polen.

    Storbritannia - Hovedkvarter

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

    Polen - Lokale teknologisentre

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

      The Codest

    • Hjem
    • Om oss
    • Tjenester
    • Casestudier
    • Vet hvordan
    • Karriere
    • Ordbok

      Tjenester

    • Det rådgivende
    • Programvareutvikling
    • Backend-utvikling
    • Frontend-utvikling
    • Staff Augmentation
    • Backend-utviklere
    • Ingeniører i skyen
    • Dataingeniører
    • Annet
    • QA-ingeniører

      Ressurser

    • Fakta og myter om samarbeid med en ekstern programvareutviklingspartner
    • Fra USA til Europa: Hvorfor velger amerikanske oppstartsbedrifter å flytte til Europa?
    • Sammenligning av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinene), Eurasia (Tyrkia)
    • Hva er de største utfordringene for CTO-er og CIO-er?
    • The Codest
    • The Codest
    • The Codest
    • Retningslinjer for personver
    • Vilkår for bruk av nettstedet

    Opphavsrett © 2025 av The Codest. Alle rettigheter forbeholdt.

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