ord og kode
admin - januar 14, 2022NERD ALERT: jeg elsker databaser. De er bare fantastiske. Få ting giver mig så meget glæde som en tom tavle og et par indviklede sammenføjningstabeller, der skal skitseres. Men der er også en kunst til at forstå, hvordan man håndterer data – især når du har en lort ton af det.
hovedproblemet folk løber ind i med data er først, hvordan man går om at gemme det, og for det andet, hvordan man går om at få det, når du rent faktisk har brug for det! Dette lyder dog ikke super kompliceret, ikke? Forkert. Databaser vokser lodret, ikke vandret, og de vokser hella hurtigt. På et bestemt tidspunkt, den måde, du går om lagring af dine data ender direkte påvirker hvordan du går om at hente det!
mange Rubyister skriver forskellige hjælpemetoder for at gøre deres forespørgsel til dem. Men dette er Rails Land, hvilket betyder, at vi har black Rails magic til vores rådighed. Og med fremkomsten af Rails 4.1 har den magi nu et navn: enum.
Få Yo Enum På
Når Skinner 4.1 blev udgivet for mindre end et år siden, det kom ud med en masse nye funktioner. En af dem var ActiveRecord enums, som i det væsentlige skar mange metoder og overflødig kode ud.
ActiveRecord enums giver dig mulighed for at manipulere attributterne for et ActiveRecord-objekt i Skinner, således at en attributs værdier kortlægges til heltal i databasen (i modsætning til strenge), og alligevel kan også forespørges ved navn. Hvis alt dette lyder lidt vanvittigt for dig, er det fordi det er! Enums er ret seje, fordi de har fleksibiliteten i en streng, men hastigheden og effektiviteten af et heltal. Du kan slå værdier op i en enorm database ved hjælp af et heltal, men du kan også opdatere og tilføje attributter som streng. Åh-Du får også en masse metoder gratis!
så hvordan fungerer denne magi, præcis? Jeg troede, du aldrig ville spørge!
Flere Kolonner?! Ingen har tid til det!
for at demonstrere, hvordan man implementerer ActiveRecord enums, fortsætter jeg med at bruge sidste uges eCommerce bookstore-app som mit eksempel. Så jeg har disse Book
objekter i min butik, og jeg vil holde styr på, hvad deres status er: enten in stock
, out of stock
eller ordered
. For enkelhedens skyld vil vi foregive, at jeg ikke er en super sofistikeret boghandler, så jeg har ikke mange Book
s, og derfor kan hvert Book
objekt kun have en af disse tre stater.
Jeg kan først starte med at have tre forskellige kolonner til at repræsentere hver af disse stater:
1234567 |
|
men det virker lidt … latterligt. Jeg vil altid have to tomme kolonner. Denne kode har mig alle som:
alternativt kunne jeg kombinere alle disse kolonner i en og bruge nogle hjælpemetoder, der returnerer boolske værdier, når jeg kalder dem på en forekomst af en Book
:
12345678910111213 |
|
Nå, nu har jeg en kolonne, så det er bedre. Men det er stadig så gentagende, grimt og ineffektivt. Bare rolig, det er ved at blive rigtig godt.
forespørgsel dit lille hjerte ud
implementering af enum er ret simpelt. Føj først makroen til din klasse:
123 |
|
Du vil bemærke, at jeg har min status
attribut kategoriseret i mine tre forskellige muligheder. Det faktum, at de ligner symboler i et array, er ingen fejl – hvert af disse symboler er faktisk forbundet med dets indeks. Så in_stock
vil blive henvist til dets indeksnummer 0
, out_of_stock
af 1
og ordered
af 2
.
tilføj derefter en kolonne til din migrering, der gør det muligt for ActiveRecord enum at udføre dine forespørgsler:
12345 |
|
Jeg vil have alle mine Book
objekter til standard til en in_stock
status, når de oprettes, så jeg tilføjede en default: 0
til min kolonne. Tilføjelse af en standard er altid en god måde at holde din kode defensiv på.
nu hvis jeg vil oprette et Book
objekt og kontrollere dets status:
1234567891011121314151617 |
|
gå videre og rul op, hvis du ikke tror på mig – Jeg lover, at jeg ikke lavede nogen af disse metoder! Enum gav dem til mig, fo gratis. Så hvad sker der faktisk her? Nå, ikke meget mere end ActiveRecord kortlægning af heltal svarende til indekserne for de symboler, vi leverede i enum-makroarrayet.
vores database har kun en kolonne, der gemmer alle disse oplysninger: status
. Denne kolonne har rækker, der alle er enten 1
, 2
eller 3
. ActiveRecord trækker de faktiske symboler, der svarer til disse array indekser, og returnerer dem, samtidig skabe en in_stock
, out_of_stock
, og ordered
omfang. Og prikken over i ‘ et: alle hjælpermetoder, der straks genereres for os i processen!
Tips og Tricks
Enums giver dig en masse fleksibilitet. For eksempel spillede jeg rundt med in_stock
omfanget af mit Book
objekt for at oprette en bestemt klassemetode, der ville bestille de tre nyeste bøger, der blev tilføjet til min beholdning:
1 |
|
En anden ting at huske er, at du ikke kan bruge de samme navne til forskellige enums i samme klasse:
1234 |
|
absolut ikke gøre dette – dette vil rejse en ActiveRecord fejl!
en enorm upside til at bruge enums er deres bidrag til din ansøgning hastighed og ydeevne. Det er et velkendt faktum, at det er meget billigere at gemme data som et heltal i hukommelsen snarere end som en strengværdi. Enums drager fordel af det, alligevel giver dig mulighed for at bruge alle de ActiveRecord-metoder, du kender og elsker.
så du kan få din menneskelæsbare og sjove programkode uden at ofre nogen af den hastighed og ydeevne, du har brug for for at gemme og få adgang til dine oplysninger. Jeg antager, at drømme virkelig går i opfyldelse.
tl; dr?
Seneste indlæg
- Om os-Gandolfo Helin & Fountain Literary Management
- 5 ting at vide om Shalane Flanagan
- Rolling Stone
- hudtoksicitet
- Sergei Tcherepnin-Artadia
- Sådan håndteres Social Stress og pres
- hvilken hest race er den smarteste?
- kiselsyre (Si(OH)4) er en signifikant indflydelse på atomabsorptionssignalet for aluminium målt ved grafitovn atomabsorptionsspektrometri (GFAAS)
- forklarer vores Smarts Del 8 – Self Smart
- Sadie T. M. Aleksander (1898-1989)
Skriv et svar