Skip to content

Archives

  • mars 2022
  • februar 2022
  • januar 2022
  • desember 2021
  • november 2021

Categories

  • Ingen kategorier
Calor Blogfever risk

Ord og Kode

admin - januar 14, 2022

NERD ALERT: jeg elsker databaser. Gud, de er bare fantastiske. Få ting gir meg så mye glede som en tom tavle og et par intrikate sammenføyningstabeller som må skisseres ut. Men det er også en kunst å forstå hvordan man håndterer data-spesielt når du har en dritt massevis av det.

hovedproblemet folk støter på med data, er først, hvordan du skal lagre det, og for det andre, hvordan du skal få det når du faktisk trenger det! Dette høres ikke super komplisert skjønt, ikke sant? Feil. Databaser vokser vertikalt, ikke horisontalt, og de vokser hella raskt. På et visst punkt, måten du går om lagring av data ender opp direkte påvirker hvordan du går om å hente den!

mange Rubyister skriver forskjellige hjelpemetoder for å spørre etter dem. Men Dette Er Rails Land, noe som betyr at vi har svart Rails magi til rådighet. Og med adventen Av Rails 4.1, har den magien nå et navn: enum.

  • Få Yo Enum På
  • Flere Kolonner?! Ingen Har Tid til Det!
  • Spør Ditt Lille Hjerte Ut
  • Tips Og Triks
  • tl; dr?

Få Yo Enum På

Når Skinner 4.1 ble utgitt mindre enn et år siden, det kom ut med en rekke nye funksjoner. En av dem var ActiveRecord enums, som i hovedsak kuttet ut mange metoder og overflødig kode.

ActiveRecord enums lar deg manipulere attributtene til Et ActiveRecord-objekt i Rails slik at attributtets verdier tilordnes heltall i databasen (i motsetning til strenger), og likevel kan også spørres etter navn. Hvis alt dette høres litt gal ut for deg, er det fordi det er! Enums er ganske kule fordi de har fleksibiliteten til en streng, men hastigheten og effektiviteten til et heltall. Du kan slå opp verdier i en stor database ved hjelp av et heltall, men du kan også oppdatere og legge til attributter som streng. Oh – du får også en haug med metoder GRATIS!

så hvordan fungerer denne magien, akkurat? Jeg trodde du aldri ville spørre!

Flere Kolonner?! Ingen Har Tid til Det!

for å demonstrere hvordan du implementerer ActiveRecord enums, vil jeg fortsette å bruke forrige ukes e-handel bokhandel app som mitt eksempel. Så, jeg har disse Book objektene i butikken min, og jeg vil holde oversikt over hva deres status er: enten in stock, out of stock eller ordered. For enkelhets skyld vil vi late som om jeg ikke er en super sofistikert bokhandler, så jeg har ikke mye Books, og derfor kan hver Book objekt bare ha en av disse tre statene.

jeg kan først starte med å ha tre forskjellige kolonner for å representere hver av disse statene:

1234567
class AddStatusesToBooks < ActiveRecord::Migration def change add_column :books, :in_stock?, :boolean add_column :books, :out_of_stock?, :boolean add_column :books, :ordered?, :boolean endend

Men dette virker litt … latterlig. Jeg kommer alltid til å ha to tomme kolonner. Denne koden har meg alle som:

Alternativt kan jeg kombinere alle disse kolonnene i en og bruke noen hjelpemetoder som returnerer boolske verdier når jeg ringer dem på en forekomst av en Book:

12345678910111213
class Book < ActiveRecord::Base def in_stock? self.status == 'in stock' end def out_of_stock? self.status == 'out of stock' end def ordered? self.status == 'ordered' endend

vel, nå har jeg en kolonne, så det er bedre. Men dette er fortsatt så repeterende, stygg og ineffektiv. Ikke bekymre deg, det er i ferd med å bli virkelig bra.

Spør Ditt Lille Hjerte Ut

Implementering av enum er ganske enkelt. Først legger du til makroen i klassen din:

123
class Book < ActiveRecord::Base enum status: end

Du vil legge merke til at jeg har min status attributt kategorisert i mine tre forskjellige alternativer. Det faktum at de ser ut som symboler i en matrise, er ingen feil-hver av disse symbolene er faktisk knyttet til indeksen. Så in_stock vil bli referert av indeksnummeret 0, out_of_stock av 1 og ordered av 2.

Legg Deretter til en kolonne i overføringen som gjør At ActiveRecord enum kan utføre spørringene dine:

12345
class AddStatusToBooks < ActiveRecord::Migration def change add_column :books, :status, :integer, default: 0 endend

jeg vil at alle mine Book objekter skal standard til en in_stock status når de er opprettet, så jeg la til en default: 0 til kolonnen min. Legge til en standard er alltid en god måte å holde koden defensiv.

nå hvis jeg vil lage et Book objekt og sjekke statusen:

1234567891011121314151617
book = Book.createbook.status# => "in_stock"book.out_of_stock?# => falsebook.status = :orderedbook.ordered! #updates the objectbook.ordered?# => truebook.status?# => "ordered"book.out_of_stock# => #<ActiveRecord::Relation >

Gå videre og bla opp hvis du ikke tror meg-jeg lover at jeg ikke gjorde noen av disse metodene! Enum ga dem til MEG, FO GRATIS. Så hva skjer egentlig her? Vel, ikke mye mer Enn ActiveRecord kartlegger heltallet som svarer til indeksene til symbolene vi oppgav i enum makro array.

vår database har bare en kolonne som lagrer all denne informasjonen: status. Den kolonnen har rader som alle er enten 1, 2 eller 3. ActiveRecord trekker de faktiske symbolene som samsvarer med disse matriseindeksene, og returnerer dem samtidig som de oppretter et omfang in_stock, out_of_stock og ordered. Og glasur på kaken: alle hjelpemetoder som umiddelbart genereres for oss i prosessen!

Tips Og Triks

Enums gir deg mye fleksibilitet. For eksempel spilte jeg rundt med in_stock omfanget av objektet mitt Book for å lage en bestemt klassemetode som ville bestille de tre nyeste bøkene som ble lagt til i lageret mitt:

1
scope :newest_stock, -> (limit: 3) { in_stock.order('date DESC').limit(limit) }

En annen ting å huske er at du ikke kan bruke de samme navnene for forskjellige enums av samme klasse:

1234
class Book < ActiveRecord::Base enum status: enum inventory: end

Definitivt ikke gjør dette – dette vil øke En ActiveRecord feil!

en stor oppside for å bruke enums er deres bidrag til programmets hastighet og ytelse. Det er et velkjent faktum at det er mye billigere å lagre data som et heltall i minnet, i stedet for som en strengverdi. Enums dra nytte av det, men lar deg bruke alle ActiveRecord-metodene du kjenner og elsker.

så, du kan ha din lesbar og morsom å programkode uten å ofre noen av hastigheten og ytelsen som du trenger for å lagre og få tilgang til informasjon. Jeg tror drømmer virkelig går i oppfyllelse.

tl; dr?

Legg igjen en kommentar Avbryt svar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

Siste innlegg

  • Om Oss-Gandolfo Helin & Fountain Literary Management
  • 5 Ting Å Vite Om Shalane Flanagan
  • Rolling Stone
  • Hudtoksisitet
  • Sergei Tcherepnin-Artadia
  • Hvordan Takle Sosialt Stress Og Press
  • Hvilken Hest Rase Er Den Smarteste?
  • Kiselsyre (SI(OH)4) er en betydelig innflytelse på atomabsorpsjonssignalet av aluminium målt ved grafittovn atomabsorpsjonsspektrometri (gfaas)
  • Explaining Our Smarts Part 8 – Self Smart
  • Sadie T. M. Alexander (1898-1989)

Arkiv

  • mars 2022
  • februar 2022
  • januar 2022
  • desember 2021
  • november 2021

Meta

  • Logg inn
  • Innleggsstrøm
  • Kommentarstrøm
  • WordPress.org
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어

Copyright Calor Blog 2022 | Theme by ThemeinProgress | Proudly powered by WordPress