window.pipedriveLeadboosterConfig = { bas: 'leadbooster-chat.pipedrive.com', företagId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = fönster if (w.LeadBooster) { console.warn('LeadBooster finns redan') } annars { w.LeadBooster = { q: [], on: funktion (n, h) { this.q.push({ t: "o", n: n, h: h }) }, trigger: funktion (n) { this.q.push({ t: 't', n: n }) }, } } })() Gränssnitt för aktiv registerförfrågan - The Codest
Codest
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Industrier
    • Fintech & bankverksamhet
    • E-commerce
    • Adtech
    • Hälsoteknik
    • Tillverkning
    • Logistik
    • Fordon
    • IOT
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
Pil tillbaka GÅ TILLBAKA
2020-06-03
Utveckling av programvara

Active Record Query-gränssnitt

Marta Polec

Prestanda är en av de viktigaste aspekterna att ta hänsyn till när man utvecklar webbapplikationer. Att analysera hur data hämtas från en databas är en bra utgångspunkt när man letar efter förbättringar. I den här artikeln hittar du exempel på hur du kan förbättra prestandan genom att använda aggregerade funktioner och filtrera data på databasnivå.

Lite sammanhang till att börja med

Den här artikeln är inspirerad av ett verkligt problem som jag en gång har ställts inför. Att hantera det lärde mig mycket, och jag har det fortfarande som en referens i mitt sinne. Jag tycker att exempel är en bra inlärningsresurs, de kan klargöra mycket. I den här artikeln vill jag dela med mig av några exempel på hur man använder Active Record-frågemetoderna.

För att inte introducera domänspecifika detaljer kommer jag att använda en exempelapplikation för ett bibliotek för att illustrera exempel. Det hela är ganska enkelt, som visas i diagrammet nedan. Vi har fyra tabeller: författare, böcker, användare och uthyrning. En användare kan låna många böcker och en bok kan lånas av många användare, så vi behöver en joining-tabell för att modellera många-till-många-relationer. I vårt fall är det tabellen rentals. Vi lagrar också ytterligare information där, nämligen datum för lån och återlämning. En författare kan ha många böcker kopplade till sitt namn. En bok har också ett attribut som definierar dess genre.

Statistik över användarläsning

Uppgiften var att ta fram statistik för en enskild användare, så att vi kunde se hur många böcker från varje genre som lånats ut. Min första tanke var att hämta alla böcker som har lånats av användaren, gruppera dem efter genre och sedan göra mappningen, så att varje genre har ett antal böcker tilldelade istället för en lista. Här är vad jag kom fram till:

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

Även om det här tillvägagångssättet fungerar och ser snyggt ut utnyttjar det inte alla de möjligheter som Active Record-frågemetoderna erbjuder. Tack vare dem kan vi filtrera och aggregera data på databasnivå utan att använda rå SQL direkt i våra kod. Att arbeta på en db-nivå ökar också vår effektivitet.

I exemplet ovan kan vi använda metoden group i stället för Ruby's groupper metod. Den kommer att tillämpa GROUPBY-klausul till tSQL-frågan. Dessutom kan kartläggnings- och storleksmetoden ersättas med en räkneaggregationsfunktion. I slutändan har vi kvar en fråga som ser ut så här:

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

Det ser ännu enklare ut!

Andra användbara exempel

Nedan hittar du några andra sätt att använda frågemetoderna som jag tycker är värda att känna till.

Inbjudan till inaktiva användare

UPPGIFT: Filtrera användare som aldrig har lånat en bok eller som gjorde det för mer än ett år sedan.

Vi kan hämta alla användare genom att inkludera de associerade hyrorna och sedan filtrera dem med hjälp av select-metoden.

User.includes(:rentals).select do |user|
 användare.uthyrning.tom? || user.rentals.none? { |rental| rental.start_date >= Datum.idag - 1.år }
end 

Men det finns naturligtvis inget behov av att hämta allt. Genom att använda query-metoderna kan vi filtrera bort det på db-nivå. Låt oss först välja ut användare som har lånat några böcker under det senaste året och sedan utesluta dem från det slutliga urvalet.

Så här kommer underfrågeställningen att se ut:

User.joins(:rentals).where(rentals: { start_date: (Datum.idag - 1.år).Datum.idag })

Och nu, låt oss sätta ihop det hela:

User.where.not(id: [User.joins(:rentals).where(rentals: { start_datum: (Datum.idag - 1.år)..Datum.idag })])

Underrepresenterade författare

UPPGIFT: Hitta författare med en eller noll utlånade böcker

Att göra det med select-metoden är superenkelt, men återigen - det finns inget behov av att arbeta med en så stor uppsättning data eftersom db kan filtrera det åt oss:

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

Sedan går det snabbt och enkelt att filtrera författare som inte har några böcker tilldelade:

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

Det är viktigt att komma ihåg en sak när du använder left_joins (och outer joins i allmänhet). Om det finns poster i den vänstra tabellen (här: författare) som inte har motsvarande poster i den högra tabellen (här: böcker), kommer kolumnerna i den högra tabellen att fyllas i med nollvärden.

Eftersom vi också behöver författare med en bok tilldelad i systemet, finns det några fler operationer att göra. Vi måste göra grupperingar, räkna och lägga till ett villkor. Så här sätter vi ihop det hela:

Författare.left_joins(:böcker).group(:id).having("count(*) <= ?", 1)

Villkoret kommer efter aggregeringsfunktionen, så vi måste använda HAVING-satsen i stället för WHERE-satsen för att ange det.

Active Record-frågemetoderna är värda att kontrollera när man tänker på applikationsprestanda. De kan förenkla din kod och få den att fungera snabbare. Jag hoppas att de delade exemplen kommer att hjälpa dig att utforska de möjligheter som frågemetoderna har att erbjuda.

Läs mer om detta:

– Dags för en ny verklighet. En era av distansarbete har börjat för en månad sedan

– Behöver du använda de vanliga JS-ramverken i din Rails-app? Stimulus.js kan vara ett alternativ

– Utveckling av webbapplikationer: Varför är Ruby on Rails en teknik som är värd att välja?

Relaterade artiklar

Utveckling av programvara

Bygg framtidssäkrade webbappar: Insikter från The Codest:s expertteam

Upptäck hur The Codest utmärker sig genom att skapa skalbara, interaktiva webbapplikationer med banbrytande teknik som ger sömlösa användarupplevelser på alla plattformar. Läs om hur vår expertis driver digital omvandling och affärsutveckling...

DEKODEST
Utveckling av programvara

Topp 10 Lettlandsbaserade mjukvaruutvecklingsföretag

Läs mer om Lettlands främsta mjukvaruutvecklingsföretag och deras innovativa lösningar i vår senaste artikel. Upptäck hur dessa teknikledare kan hjälpa till att lyfta ditt företag.

thecodest
Lösningar för företag och uppskalningsföretag

Java Software Development Essentials: En guide till framgångsrik outsourcing

Utforska denna viktiga guide om framgångsrik outsourcing av Java-programvaruutveckling för att förbättra effektiviteten, få tillgång till expertis och driva projektframgång med The Codest.

thecodest
Utveckling av programvara

Den ultimata guiden till outsourcing i Polen

Den kraftiga ökningen av outsourcing i Polen drivs av ekonomiska, utbildningsmässiga och tekniska framsteg, vilket främjar IT-tillväxt och ett företagsvänligt klimat.

TheCodest
Lösningar för företag och uppskalningsföretag

Den kompletta guiden till verktyg och tekniker för IT-revision

IT-revisioner säkerställer säkra, effektiva och kompatibla system. Läs mer om hur viktiga de är genom att läsa hela artikeln.

Codest
Jakub Jakubowicz CTO och medgrundare

Prenumerera på vår kunskapsbas och håll dig uppdaterad om expertisen från IT-sektorn.

    Om oss

    The Codest - Internationellt mjukvaruutvecklingsföretag med teknikhubbar i Polen.

    Förenade kungariket - Huvudkontor

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

    Polen - Lokala tekniknav

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

      Codest

    • Hem
    • Om oss
    • Tjänster
    • Fallstudier
    • Vet hur
    • Karriär
    • Ordbok

      Tjänster

    • Det rådgivande
    • Utveckling av programvara
    • Backend-utveckling
    • Frontend-utveckling
    • Staff Augmentation
    • Backend-utvecklare
    • Ingenjörer inom molntjänster
    • Dataingenjörer
    • Övriga
    • QA-ingenjörer

      Resurser

    • Fakta och myter om att samarbeta med en extern partner för mjukvaruutveckling
    • Från USA till Europa: Varför väljer amerikanska startup-företag att flytta till Europa?
    • Jämförelse av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinerna), Eurasien (Turkiet)
    • Vilka är de största utmaningarna för CTO:er och CIO:er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Användarvillkor för webbplatsen

    Copyright © 2025 av The Codest. Alla rättigheter reserverade.

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