Pedro Rolo
Tiago Madeira

April 28, 2021

Min Read

Forespørgsler på Rails - Active Record og Arel

Dette indlæg blev oprindeligt udgivet i juli 2018 af Pedro Rolo og opdateret i juni 2020 af Tiago Madeira .

Der er flere funktioner, der gør Ruby on Rails attraktivt, men hvor det virkelig skinner, er, når det kommer til at få information fra relationelle databaser. Dens ORM -Aktiv optegnelse - tilbyder nu en meget moden grænseflade - der skaber den rigtige balance mellem kortfattethed og magt.

I denne artikel vil jeg give nogle enkle eksempler på, hvordan man udtrækker information fra en database. Dette er ikke beregnet til at være en omfattende guide, men snarere et sæt værktøjer, som jeg har fundet nyttige i min hverdags arbejde. Det, jeg præsenterer nedenfor, er også baseret på den seneste Rails-opdatering (Rails 6).

Jeg starter med at definere en domænemodel, som jeg vil køre mine forespørgsler mod:

blue arrow to the left
Imaginary Cloud logo

Vores domænemodel

Vi bruger følgende domænemodel i vores eksempler:

Domain Model

undefinedDybest set, undefined og undefined tilhører en undefined, og undefined og undefined har et mange-til-mange-forhold mellem dem, som er gemt i relationstabellen undefined.

blue arrow to the left
Imaginary Cloud logo

Hvad er ActiveRecord

Den undefined er det, der binder modellen i vores ruby-applikation med dens respektive databasetabel. Det aktive postobjekt leveres med et sæt metoder, der hjælper os med at forespørge databaseposter, så der er ingen grund til at bruge rå SQL. Til sammenligningsformål præsenteres oversættelsen af vores activerecord-forespørgsler til sql-forespørgsler. Du kan nemt udføre denne oversættelse ved hjælp af undefined.

ActiveRecord enkle forespørgsler

De mest enkle forespørgsler involverer kun en enkelt tabel og forsøger at få de poster, der har bestemte specifikke værdier på deres kolonner.

Lad os for eksempel sige, at vi vil finde ud af, hvem der har John som fornavn:

‍undefined

undefined

Vi kan også bruge arrays med ønskelige værdier i stedet for enkeltværdier. Det vil generere forespørgsler, der bruger undefined SQL-nøgleord:undefined

undefined

Ud over arrays accepteres intervaller også som værdiprædikater:

undefined

Du kan også have uendelige intervaller:

undefined

som nu med Rails 6 simpelthen kan skrives som:undefined

undefined

ActiveRecord-komponerbare forespørgsler

Det er muligt at begrænse vores forespørgsler til flere samtidige prædikater. Vi kan enten levere undefined en hash med flere nøgleord, eller vi kan kæde flere påkaldelser af undefined:

undefined

Hvis vi ellers ønsker at komponere vores prædikater med en undefined Vi kan bruge undefined.

undefined

Når vi kun søger efter en bestemt række, kan vi bruge undefined i stedet, som stopper søgningen, når den finder det første match ved at bruge undefined

‍undefined

Eller vi kan give vores egen brugerdefinerede grænse ved at kæde undefined til vores undefined forespørgsler:

Negerende prædikater

Det er muligt at få optegnelserne ikke matchende en bestemt betingelse ved at bruge undefined sammen med undefined:

undefined

Sortering

Det er muligt at bruge undefined for at sortere resultaterne i stigende eller aftagende rækkefølge:

undefined

undefined

Gruppering

Der er flere funktioner, der gør det muligt at folde et forespørgselsresultat til bestemte værdier, f.eks undefined, undefined, undefined og undefined:

undefined

undefined

Derudover er det muligt at gruppere elementer efter en given kolonne og folde disse elementer med disse foldefunktioner og dermed udføre undefined forespørgsler:

undefined

blue arrow to the left
Imaginary Cloud logo

ActiveRecord slutter sig

Den mest almindelige brugssag vedrørende flere tabeller handler om ivrig indlæsning af nogle enheder, der er relateret til vores valgte model, som for eksempel kan åbnes iterativt. Dette problem er almindeligt kendt som undefined og følgende interaktion gør det tydeligt:

undefined

undefined

Som vi ser, udføres en ny forespørgsel hver gang vi gentager en person for at få adgang til sit land.

Venstre ydre slutter sig til undefined

Left Outer Join Venn Diagram

undefined giver os mulighed for ivrig at indlæse alle data på én gang og dermed optimere det, der udføres ovenfor. Det opfører sig som en undefinedog indlæser således alle poster i den relaterede model, der vedrører vores hovedmodelposter.

undefined

Men vent, det er ikke en undefined - kan du sige! Nå, da der ikke er yderligere begrænsninger for de lande, vi vælger, foretrækker Rails at ty til en undefined forespørgsel, der udnytter det primære nøgleindeks. Men hvis vi tilføjer begrænsninger til vores forespørgsel, udfører aktiv post en undefined i stedet:

Hvad der skal bemærkes i eksemplet ovenfor er brugen af en hash på whe-betingelsen for at specificere begrænsninger på vores refererede modeller.

Vi kan også ivrige indlæse flere relationer på én gang:

undefined

Og det er også muligt at gøre det på en indlejret måde ved at videregive en relations-hash i stedet:

‍undefined

Indre slutter sig til undefined

Inner Join Venn Diagram

Nogle gange er vi kun interesserede i de poster, der er knyttet til det relaterede modul. Når dette er tilfældet, bruger vi undefined, som har semantikken af en undefined.

Vi illustrerer behovet for denne funktion i følgende eksempel, hvor vi kun agter at gentage gennem mennesker, der faktisk er forbundet med et land:

undefined

Quering af ActiveRecord-associationer med specifikke værdier

Hvis vi kun er interesseret i poster, der er knyttet til en relateret model med specifikke attributværdier, kan vi bruge undefined og derefter undefined for at specificere begrænsninger på vores modeller.

blue arrow to the left
Imaginary Cloud logo

Genanvendelige forespørgselsabstraktioner med klassemetoder

Godt, alle forespørgsler skrevet indtil videre er ret lange. Når de bliver komplicerede eller er beregnet til at blive genbrugt gennem vores kode, er det praktisk at give dem navne.

I ældre versioner af skinner skal du bruge undefined klassemetode til at oprette sådanne genanvendelige forespørgsler. Du er i stand til at opnå den samme funktionalitet ved blot at definere klassemetoder:

undefined

Når du har defineret forespørgslerne på en sådan måde, er du i stand til at kæde disse abstraktioner på højt niveau sammen.

undefined

blue arrow to the left
Imaginary Cloud logo

Hvad er Arel

Arel er et domænespecifikt sprog, der giver mulighed for at udtrykke dine forespørgsler i relationel algebra. I tidligere versioner af Rails var det ret almindeligt at skulle ty til Arel for at udføre nogle ret ofte efterspurgte funktionaliteter, skønt i dag dækker Rails 6s Active Record allerede de fleste af disse brugssager.

Jeg vil starte med at præsentere nogle af de allerede præsenterede Rails 6 forespørgsler ved at bruge Arel i stedet for almindelig aktiv post. Og senere fokusere på, hvordan man skriver nogle sager, hvor man stadig ville have brug for Arel.

Arel bord

Når man opretter Arel-forespørgsler starter man normalt med at få undefined objekter i SQL-tabellerne, vi vil interagere med:

undefined

undefined

Vi kan få adgang til samlingerne på vores tabeller som en hash. Fra disse tabeller er man i stand til at definere prædikater (undefined) påberåbe sig metoder på dens attributter, som er tilgængelige via metoden undefined:

Arel enkle forespørgselsprædikater

Prædikaterne undefined, undefined, undefined, undefined, undefined, undefined svarer til operatørerne =,! =, <, >, <=, >= og fungerer sådan:

undefined

undefined

Den undefined & undefined kan bruges til at oprette multitable prædikater og arbejde på en lignende måde, som denne:

undefined

Vi kan senere videregive disse prædikater til undefined, og så længe de krævede tabeller er forbundet, konverteres prædikatet med succes til SQL:

Arel matcher (SQL LIKE)

Dette er et brugssager, hvor man stadig skal ty til Arel for at få en databaseuafhængig forespørgsel. For at gøre det skal man kombinere undefined Arel-prædikat med undefined SQL-jokertegn:

Dette returnerer personer, hvis efternavn starter med tegnet „A“.

blue arrow to the left
Imaginary Cloud logo

Konklusion

Både Arel og Active Record har mange flere funktionaliteter end dem, jeg her har præsenteret. Men de er mere end nok til at komme i gang med applikationer med enkle krav.

I sidste ende kommer det til præference at vælge mellem ActiveRecord-forespørgselsmetoder eller Arel, når vi udfører vores daglige forespørgsler. Jeg finder ActiveRecord-syntaksen lettere at læse og bruge, men Arel kan stadig være nyttig, når man beskæftiger sig med komplekse forespørgsler.

Ready for a UX Audit? Book a free call

Fandt du denne artikel nyttig? Du kan måske også lide disse!

blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
Pedro Rolo
Pedro Rolo

Rails-udvikler med 10+ års erfaring med forskellige teknologier. Jeg er interesseret i funktionel programmering.

Read more posts by this author
Tiago Madeira
Tiago Madeira

Datalogstuderende og ImaginaryCloud deltidstimer. Ivrig efter at lære nye teknologier og teknikker. Tennis og klaverspiller.

Read more posts by this author

People who read this post, also found these interesting:

Dropdown caret icon