Skip to content

Archives

  • mars 2022
  • februari 2022
  • januari 2022
  • december 2021
  • november 2021

Categories

  • Inga kategorier
Calor Blogfever risk

ord och kod

admin - januari 14, 2022

NERD ALERT: jag älskar databaser. Gud, de är bara fantastiska. Få saker ger mig så mycket glädje som en tom whiteboard och ett par intrikata gå tabeller som måste skissas ut. Men det finns också en konst att förstå hur man hanterar data – särskilt när du har en skit ton av det.

huvudproblemet som människor stöter på med data är först, hur man ska lagra det och för det andra hur man ska få det när du faktiskt behöver det! Det låter dock inte superkomplicerat, eller hur? Fel. Databaser växer vertikalt, inte horisontellt, och de växer hella snabbt. Vid en viss punkt, det sätt som du går om att lagra dina data hamnar direkt påverkar hur du går om att hämta det!

många Rubyister skriver olika hjälpmetoder för att göra sin Fråga för dem. Men det här är Rails Land, vilket innebär att vi har black Rails magi till vårt förfogande. Och med tillkomsten av Rails 4.1 har den magin nu ett namn: enum.

  • Få Yo Enum På
  • Flera Kolumner?! Ingen har tid för det!
  • fråga ditt lilla hjärta ut
  • Tips och Tricks
  • tl; dr?

Få Yo Enum På

När Skenor 4.1 släpptes för mindre än ett år sedan, det kom ut med en massa nya funktioner. En av dem var ActiveRecord enums, som i huvudsak skar ut många metoder och överflödig kod.

ActiveRecord enums låter dig manipulera attributen för ett ActiveRecord-objekt i Rails så att ett attributs värden mappas till heltal i databasen (i motsats till strängar), och ändå kan också frågas med namn. Om allt detta låter lite galet för dig, det beror på att det är! Enums är ganska coola eftersom de har flexibiliteten hos en sträng, men hastigheten och effektiviteten hos ett heltal. Du kan slå upp värden i en enorm databas med ett heltal, men du kan också uppdatera och lägga till attribut som sträng. Åh-du får också en massa metoder gratis!

så hur fungerar denna magi, exakt? Jag trodde att du aldrig skulle fråga!

Flera Kolumner?! Ingen har tid för det!

för att visa hur man implementerar ActiveRecord enums fortsätter jag att använda förra veckans ecommerce bookstore-app som mitt exempel. Så jag har dessa Book objekt i min butik, och jag vill hålla reda på vad deras status är: antingen in stock, out of stockeller ordered. För enkelhetens skull låtsas vi att jag inte är en super sofistikerad bokhandlare, så jag har inte mycket Books, och därför kan varje Book objekt bara ha en av dessa tre stater.

Jag kan först börja med att ha tre olika kolumner för att representera var och en av dessa stater:

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 detta verkar typ av…löjligt. Jag kommer alltid att ha två tomma kolumner. Den här koden har mig alla som:

Alternativt kan jag kombinera alla dessa kolumner i en och använda några hjälpmetoder som returnerar booleska värden när jag ringer dem på en instans 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

Tja, nu har jag en kolumn, så det är bättre. Men det här är fortfarande så repetitivt, fult och ineffektivt. Oroa dig inte, det är på väg att bli riktigt bra.

fråga ditt lilla hjärta ut

att implementera enum är ganska enkelt. Lägg först till makrot i din klass:

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

Du kommer att märka att jag har min status attribut kategoriseras i mina tre olika alternativ. Det faktum att de ser ut som symboler i en matris är inget misstag – var och en av dessa symboler är faktiskt associerad med dess index. Så in_stock kommer att refereras av dess indexnummer 0, out_of_stock av 1 och ordered av 2.

lägg sedan till en kolumn i din migrering som gör att ActiveRecord enum kan utföra dina frågor:

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

Jag vill att alla mina Book objekt ska standard till en in_stock status när de skapas, så jag lade till en default: 0 i min kolumn. Att lägga till en standard är alltid ett bra sätt att hålla din kod defensiv.

nu om jag vill skapa ett Book objekt och kontrollera dess status:

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å vidare och bläddra upp om du inte tror mig – Jag lovar att jag inte gjorde någon av dessa metoder! Enum gav dem till mig, FO gratis. Så vad händer egentligen här? Tja, inte mycket mer än ActiveRecord som kartlägger heltalet som motsvarar indexen för symbolerna som vi tillhandahöll i enum-makromatrisen.

vår databas har bara en kolumn som lagrar all denna information: status. Den kolumnen har rader som alla är 1, 2 eller 3. ActiveRecord drar de faktiska symboler som motsvarar dessa array index, och returnerar dem, samtidigt skapa en in_stock, out_of_stock, och ordered omfattning. Och glasyren på kakan: alla hjälpmetoder som omedelbart genereras för oss i processen!

Tips och Tricks

Enums ger dig mycket flexibilitet. Till exempel spelade jag runt med in_stock omfattningen av mitt Book – objekt för att skapa en specifik klassmetod som skulle beställa de tre senaste böckerna som lagts till i min inventering:

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

En annan sak att komma ihåg är att du inte kan använda samma namn för olika enums i samma klass:

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

definitivt inte göra detta-detta kommer att höja en ActiveRecord fel!

en stor fördel med att använda enums är deras bidrag till din applikations hastighet och prestanda. Det är ett välkänt faktum att det är mycket billigare att lagra data som ett heltal i minnet, snarare än som ett strängvärde. Enums dra nytta av det, men ändå låta dig använda alla ActiveRecord metoder du känner och älskar.

så du kan ha din läsbara och roliga programkod utan att offra någon hastighet och prestanda som du behöver för att spara och få tillgång till din information. Jag antar att drömmar verkligen blir sanna.

tl; dr?

Lämna ett svar Avbryt svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Senaste inläggen

  • Om oss-Gandolfo Helin & Fountain Literary Management
  • 5 Saker att veta om Shalane Flanagan
  • Rolling Stone
  • hudtoxicitet
  • Sergej Tcherepnin-Artadia
  • Hur man hanterar Social Stress och tryck
  • vilken hästras är den smartaste?
  • kiselsyra (Si(OH)4) är ett signifikant inflytande på atomabsorptionssignalen för aluminium mätt med grafitugn atomabsorptionsspektrometri (GFAAS)
  • förklara våra Smarts Del 8-Self Smart
  • Sadie T. M. Alexander (1898-1989)

Arkiv

  • mars 2022
  • februari 2022
  • januari 2022
  • december 2021
  • november 2021

Meta

  • Logga in
  • Flöde för inlägg
  • Flöde för kommentarer
  • 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