Pedro Rolo
Tiago Madeira

28 april 2021

Min läsning

Frågor på Rails - Active Record och Arel

Det här inlägget postades ursprungligen i juli 2018 av Pedro Rolo och uppdaterades i juni 2020 av Tiago Madeira .

Det finns flera funktioner som gör Ruby on Rails attraktivt, men där det verkligen lyser är när det gäller att få information från relationsdatabaser. Dess ORM -Aktiv post - erbjuder nu ett mycket moget gränssnitt - att hitta rätt balans mellan kortfatthet och kraft.

I den här artikeln kommer jag att ge några enkla exempel på hur man extraherar information från en databas. Detta är inte tänkt att vara en omfattande guide, utan snarare en uppsättning verktyg som jag har hittat användbara i mitt dagliga arbete. Det jag presenterar nedan är också baserat på den senaste Rails-uppdateringen (Rails 6).

Jag börjar med att definiera en domänmodell mot vilken jag kommer att köra mina frågor:

blå pil till vänster
Imaginary Cloud-logotyp

Vår domänmodell

Vi använder följande domänmodell i våra exempel:

Domain Model

undefinedI grund och botten undefined och undefined tillhör en undefined, och undefined och undefined har en många-till-många-relation mellan dem, som lagras i relationstabellen undefined.

blå pil till vänster
Imaginary Cloud-logotyp

Vad är ActiveRecord

Den undefined är det som binder modellen i vår ruby-applikation med dess respektive databastabell. Det aktiva postobjektet levereras med en uppsättning metoder som hjälper oss att fråga databasposter så att det inte finns något behov av att använda rå SQL. För jämförelseändamål presenteras översättningen av våra activerecord-frågor till sql-frågor. Du kan enkelt göra denna översättning med undefined.

ActiveRecord enkla frågor

De enklaste frågorna involverar bara en enda tabell och försöker få poster som har vissa specifika värden på sina kolumner.

Låt oss till exempel säga att vi vill hitta vem som har John som förnamn:

‍undefined

undefined

Vi kan också använda matriser med önskvärda värden istället för enstaka värden. Det kommer att generera frågor som använder undefined SQL-nyckelord:undefined

undefined

Förutom matriser accepteras även intervall som värdepredikat:

undefined

Du kan också ha oändliga intervall:

undefined

som nu med Rails 6 helt enkelt kan skrivas så här:undefined

undefined

ActiveRecord-komponerbara frågor

Det är möjligt att begränsa våra frågor till flera samtidiga predikat. Vi kan antingen tillhandahålla undefined en hash med flera nyckelord eller så kan vi kedja flera åkallanden av undefined:

undefined

Om vi annars vill komponera våra predikat med en undefined Vi kan använda undefined.

undefined

När vi bara söker efter en specifik rad kan vi använda undefined istället, som slutar söka när den hittar den första matchningen genom att använda undefined

‍undefined

Eller så kan vi tillhandahålla vår egen anpassade gräns genom kedja undefined till vår undefined frågor:

Negerande predikat

Det är möjligt att få rekorden matchar inte ett visst tillstånd genom att använda undefined tillsammans med undefined:

undefined

Sortering

Det är möjligt att använda undefined för att sortera resultaten i stigande eller avtagande ordning:

undefined

undefined

Gruppering

Det finns flera funktioner som gör det möjligt att fälla ett frågeresultat till vissa värden, till exempel undefined, undefined, undefined och undefined:

undefined

undefined

Dessutom är det möjligt att gruppera element efter en given kolumn och vika dessa element med dessa vikningsfunktioner och därmed utföra undefined frågor:

undefined

blå pil till vänster
Imaginary Cloud-logotyp

ActiveRecord ansluter sig

Det vanligaste användningsfallet för flera tabeller handlar om att ivrigt ladda vissa enheter som är relaterade till vår valda modell, som till exempel kan nås iterativt. Detta problem är allmänt känt som undefined och följande interaktion gör det uppenbart:

undefined

undefined

Som vi ser utförs en ny fråga varje gång vi itererar en person för att komma åt sitt land.

Vänster yttre förenar sig med undefined

Left Outer Join Venn Diagram

undefined gör det möjligt för oss att ivrigt ladda all data på en gång och därmed optimera vad som utförs ovan. Det beter sig som en undefinedoch laddar därmed alla poster i den relaterade modellen som berör våra huvudmodellposter.

undefined

Men vänta, det är inte en undefined - kan du säga! Tja, eftersom det inte finns några ytterligare begränsningar för de länder vi väljer, föredrar Rails att tillgripa en undefined fråga, dra nytta av primärnyckelindexet. Men om vi lägger till begränsningar i vår fråga utför aktiv post en undefined istället:

Vad som ska märkas i exemplet ovan är användningen av en hash på whe-villkoret för att specificera begränsningar för våra refererade modeller.

Vi kan också ivrigt ladda flera relationer samtidigt:

undefined

Och det är också möjligt att göra det på ett kapslad sätt, genom att skicka en relationshash istället:

‍undefined

Inre förenar sig med undefined

Inner Join Venn Diagram

Ibland är vi bara intresserade av de poster som är associerade med den relaterade modulen. När så är fallet använder vi undefined, som har semantiken för en undefined.

Vi illustrerar behovet av denna funktion i följande exempel, där vi bara tänker iterera genom människor som verkligen är associerade med ett land:

undefined

Querera ActiveRecord-associationer med specifika värden

Om vi bara är intresserade av poster som är associerade med en relaterad modell med specifika attributvärden kan vi använda undefined och sedan undefined för att specificera begränsningar för våra modeller.

blå pil till vänster
Imaginary Cloud-logotyp

Återanvändbara frågeabstraktioner med klassmetoder

Väl, alla frågor som skrivits hittills är ganska långa. När de blir komplicerade eller är avsedda att återanvändas genom vår kod är det bekvämt att ge dem namn.

I äldre versioner av skenor bör du använda undefined klassmetod för att skapa sådana återanvändbara frågor. Du kan uppnå samma funktionalitet genom att helt enkelt definiera klassmetoder:

undefined

Efter att ha definierat frågorna på ett sådant sätt kan du kedja dessa abstraktioner på hög nivå tillsammans.

undefined

blå pil till vänster
Imaginary Cloud-logotyp

Vad är Arel

Arel är ett domänspecifikt språk som gör det möjligt att uttrycka dina frågor i relationell algebra. I tidigare versioner av Rails var det ganska vanligt att behöva tillgripa Arel för att uppnå några ganska ofta begärda funktioner, men numera täcker Rails 6: s Active Record redan de flesta av dessa användningsfall.

Jag börjar med att presentera några av de redan presenterade Rails 6-frågorna genom att använda Arel istället för vanlig aktiv post. Och senare fokusera på hur man skriver några fall där man fortfarande skulle behöva Arel.

Arel bord

När man skapar Arel-frågor börjar man vanligtvis med att få undefined objekt i SQL-tabellerna vi vill interagera med:

undefined

undefined

Vi kan komma åt samlingarna på våra bord som en hash. Från dessa tabeller kan man definiera predikat (undefined) åberopa metoder på dess attribut, som är tillgängliga genom metoden undefined:

Arel enkla frågepredikat

Predikaten undefined, undefined, undefined, undefined, undefined, undefined är likvärdiga med operatorerna =,! =, <, >, <=, >= och fungerar så här:

undefined

undefined

Den undefined & undefined kan användas för att skapa multitabla predikat och arbeta på ett liknande sätt, så här:

undefined

Vi kan senare överföra dessa predikat till undefined, och så länge de obligatoriska tabellerna är sammanfogade kommer predikatet att konverteras framgångsrikt till SQL:

Arel matchningar (SQL-LIKE)

Detta är ett användningsfall där man fortfarande behöver tillgripa Arel för att få en databasoberoende fråga. För att göra detta bör man kombinera undefined Arel-predikat med undefined SQL-jokertecken:

Detta returnerar personer vars efternamn börjar med tecknet ”A”.

blå pil till vänster
Imaginary Cloud-logotyp

Slutsats

Både Arel och Active Record har många fler funktioner än de jag har presenterat här. Men de är mer än tillräckligt för att komma igång med applikationer med enkla krav.

I slutändan kommer det att föredra att välja mellan ActiveRecord-frågemetoder eller Arel, när vi gör våra dagliga frågor. Jag tycker att ActiveRecord-syntaxen är lättare att läsa och använda, men Arel kan fortfarande vara användbar när man hanterar komplexa frågor.

Ready for a UX Audit? Book a free call

Hittade den här artikeln användbar? Du kanske gillar dessa också!

blå pil till vänster
Imaginary Cloud-logotyp
blå pil till vänster
Imaginary Cloud-logotyp
blå pil till vänster
Imaginary Cloud-logotyp
blå pil till vänster
Imaginary Cloud-logotyp
Pedro Rolo
Pedro Rolo

Rails utvecklare med 10+ års erfarenhet av olika tekniker. Jag är intresserad av funktionell programmering.

Läs fler inlägg av denna författare
Tiago Madeira
Tiago Madeira

Datavetenskapsstudent och ImaginaryCloud deltidsarbetare. Ivrig efter att lära sig ny teknik och teknik. Tennis- och pianospelare.

Läs fler inlägg av denna författare

People who read this post, also found these interesting:

Dropdown caret icon