Skip to content

Archives

  • maart 2022
  • februari 2022
  • januari 2022
  • december 2021
  • november 2021

Categories

  • Geen categorieën
Calor Blogfever risk

Words and Code

admin - januari 14, 2022

NERD ALERT: I love databases. God, ze zijn gewoon fantastisch. Weinig dingen geven me zo veel vreugde als een leeg whiteboard en een paar ingewikkelde join tafels die moeten worden geschetst. Maar er is ook een kunst om te begrijpen hoe om te gaan met gegevens – vooral als je een shit ton van het.

het belangrijkste probleem dat mensen tegenkomen met data is ten eerste, hoe om te gaan met het opslaan, en ten tweede, hoe om te gaan met het krijgen van het wanneer je het echt nodig hebt! Dit klinkt niet super ingewikkeld, toch? Verkeerd. Databases groeien verticaal, niet horizontaal, en ze groeien hella snel. Op een bepaald punt, de manier waarop je gaat over het opslaan van uw gegevens eindigt direct van invloed op hoe je gaat over het ophalen van het!

veel Rubyisten schrijven verschillende hulpmethoden om hen te bevragen. Maar dit is Rails Land, wat betekent dat we zwarte Rails magie tot onze beschikking hebben. En met de komst van Rails 4.1 heeft die magie nu een naam: enum.

  • Haal Uw Nummer Op
  • Meerdere Kolommen?! Daar heeft niemand tijd voor.
  • Query Your Little Heart Out
  • Tips en trucs
  • tl; dr?

Haal Uw Nummer Op

Bij Rails 4.1 werd minder dan een jaar geleden uitgebracht, het kwam uit met een heleboel nieuwe functies. Een daarvan was ActiveRecord enums, die in wezen knip veel methoden en overbodige code.

ActiveRecord enums stellen u in staat om de attributen van een ActiveRecord-object in Rails zodanig te manipuleren dat de waarden van een attribuut worden toegewezen aan gehele getallen in de database (in tegenstelling tot strings), en toch ook kunnen worden opgevraagd op naam. Als dit allemaal een beetje gek klinkt voor jou, dat is omdat het zo is! Enums zijn vrij cool omdat ze de flexibiliteit van een snaar hebben, maar de snelheid en efficiëntie van een integer. U kunt waarden opzoeken in een enorme database met behulp van een geheel getal, maar u kunt ook bijwerken en attributen toevoegen als tekenreeks. Oh-je krijgt ook een heleboel methoden gratis!

Hoe werkt deze magie precies? Ik dacht dat je het nooit zou vragen!

Meerdere Kolommen?! Daar heeft niemand tijd voor.

om aan te tonen hoe ActiveRecord enums te implementeren, zal ik de eCommerce bookstore-app van vorige week als voorbeeld blijven gebruiken. Dus, ik heb deze Book objecten in mijn winkel, en Ik wil bijhouden wat hun status is: in stock, out of stock, of ordered. Omwille van de eenvoud doen we alsof ik geen super geavanceerde boekhandelaar ben, dus ik heb niet veel Books, en daarom kan elk Book object slechts één van deze drie toestanden hebben.

Ik zou eerst kunnen beginnen met drie verschillende kolommen om elk van deze staten weer te geven:

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

maar dit lijkt een beetje … belachelijk. Ik heb altijd twee lege kolommen. Deze code heeft me allemaal als:

als alternatief kan ik al deze kolommen combineren tot één en een aantal hulpmethoden gebruiken die Booleaanse waarden retourneren wanneer ik ze aanroep op een instantie van een 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

nu heb ik één column, dus dat is beter. Maar dit is nog steeds zo repetitief, lelijk en inefficiënt. Maak je geen zorgen, het gaat heel goed worden.

Query Your Little Heart Out

implementatie van enum is vrij eenvoudig. Voeg eerst de macro toe aan je Klasse:

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

U zult merken dat ik mijn status attribuut gecategoriseerd heb in mijn drie verschillende opties. Het feit dat ze eruit zien als symbolen in een array is geen vergissing – elk van deze symbolen is eigenlijk geassocieerd met de index. Naar in_stock wordt dus verwezen door het indexnummer 0, out_of_stock door 1 en ordered door 2.

voeg vervolgens een kolom toe aan uw migratie waardoor ActiveRecord enum uw vragen kan uitvoeren:

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

Ik wil dat al mijn Book objecten standaard een in_stock status krijgen wanneer ze worden aangemaakt, dus heb ik een default: 0 aan mijn kolom toegevoegd. Het toevoegen van een standaard is altijd een goede manier om je code defensief te houden.

nu als ik een Book object wil aanmaken en de status ervan wil controleren:

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 >

ga je gang en scroll omhoog als je me niet gelooft-Ik beloof dat ik geen van deze methoden heb gemaakt! Enum gaf ze aan mij, FO FREE. Wat is hier eigenlijk aan de hand? Nou, niet veel meer dan ActiveRecord mapping het geheel getal dat overeenkomt met de indexen van de symbolen die we in de enum macro array.

onze database bevat slechts één kolom waarin al deze informatie wordt opgeslagen: status. Die kolom heeft rijen die alle 1, 2 of 3zijn. ActiveRecord trekt de werkelijke symbolen die corresponderen met deze array indexen, en geeft ze terug, waarbij tegelijkertijd een in_stock, out_of_stock, en ordered scope wordt gecreëerd. En de kers op de taart: alle helper methoden die onmiddellijk worden gegenereerd voor ons in het proces!

Tips en trucs

Enums geven u veel flexibiliteit. Bijvoorbeeld, Ik speelde met de in_stock scope van mijn Book object om een specifieke class methode te maken die de drie beste nieuwste boeken zou bestellen die aan mijn inventaris zijn toegevoegd:

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

een ander ding om te onthouden is dat je niet dezelfde namen kunt gebruiken voor verschillende enums van dezelfde klasse:

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

zeker niet doen-dit zal een ActiveRecord fout te verhogen!

een groot voordeel aan het gebruik van enums is hun bijdrage aan de snelheid en prestaties van uw applicatie. Het is een bekend feit dat het veel goedkoper is om gegevens op te slaan als een integer in het geheugen, in plaats van als een tekenreekswaarde. Enums profiteren van dat, maar kunt u alle ActiveRecord methoden die je kent en liefde gebruiken.

U kunt dus uw menselijk leesbare en fun-to-programmacode hebben zonder in te boeten aan de snelheid en prestaties die u nodig hebt om uw informatie op te slaan en te openen. Ik denk dat dromen echt uitkomen.

tl; dr?

Geef een antwoord Antwoord annuleren

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Recente berichten

  • Over ons-Gandolfo Helin & Fountain Literary Management
  • 5 dingen om te weten over Shalane Flanagan
  • Rolling Stone
  • Huidtoxiciteit
  • Sergei Tcherepnin-Artadia
  • Hoe om te gaan met sociale Stress en druk
  • welk paardenras Is het slimste?
  • kiezelzuur (Si(OH)4) een significante invloed hebben op de atomaire absorptie signaal van aluminium gemeten door grafiet-oven atomaire absorptie spectrometrie (GFAAS)
  • uitleg over onze Smartsdeel 8 – Self Smart
  • Sadie T. M. Alexander (1898-1989)

Archieven

  • maart 2022
  • februari 2022
  • januari 2022
  • december 2021
  • november 2021

Meta

  • Inloggen
  • Berichten feed
  • Reacties feed
  • 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