Skip to content

Archives

  • Březen 2022
  • Únor 2022
  • Leden 2022
  • Prosinec 2021
  • Listopad 2021

Categories

  • Žádné rubriky
Calor Blogfever risk

slova a kód

admin - 14 ledna, 2022

NERD ALERT: miluji databáze. Bože, jsou prostě fantastické. Jen málo věcí mi dává tolik radosti jako prázdná tabule a pár složitých spojovacích tabulek, které je třeba načrtnout. Ale je tu také umění pochopit, jak zacházet s daty-zvláště když jich máte hovno.

hlavním problémem, na který se lidé setkávají s daty, je první, jak je ukládat, a za druhé, jak se dostat, když to skutečně potřebujete! To však nezní příliš komplikovaně, že jo? Špatný. Databáze rostou svisle, ne vodorovně, a rostou hella rychle. V určitém okamžiku, způsob, jakým jdete o ukládání dat skončí přímo ovlivňuje, jak jít o načítání to!

mnoho Rubyistů píše různé pomocné metody, aby pro ně provedli dotazování. Ale to je Rails Land, což znamená, že máme k dispozici Black Rails magic. A s příchodem Rails 4.1 má tato magie nyní jméno: enum.

  • Get Yo Enum Na
  • Více Sloupců?! Na to nikdo nemá čas!
  • dotaz na vaše malé srdce
  • tipy a triky
  • tl; dr?

Get Yo Enum Na

Když Kolejnice 4.1 byl propuštěn méně než před rokem, to vyšlo s partou nových funkcí. Jedním z nich byl ActiveRecord enums, který v podstatě vystřihl spoustu metod a nadbytečného kódu.

ActiveRecord enums umožňují manipulovat s atributy objektu ActiveRecord v kolejnicích tak, že hodnoty atributu mapují celá čísla v databázi (na rozdíl od řetězců), a přesto mohou být také dotazovány podle názvu. Pokud vám to všechno zní trochu šíleně, je to proto, že je! Enums jsou docela v pohodě, protože mají flexibilitu řetězce, ale rychlost a účinnost celé číslo. Můžete vyhledat hodnoty v obrovské databázi pomocí celé číslo, ale můžete také aktualizovat a přidat atributy jako řetězec. Oh – získáte také spoustu metod zdarma!

tak jak to kouzlo funguje, přesně? Myslel jsem, že se nikdy nezeptáš!

Více Sloupců?! Na to nikdo nemá čas!

Chcete-li ukázat, jak implementovat ActiveRecord enums, budu i nadále používat minulý týden e-commerce Knihkupectví app jako můj příklad. Takže mám tyto objekty Book v mém obchodě a chci sledovat, jaký je jejich stav: buď in stock, out of stock nebo ordered. Pro zjednodušení budeme předstírat, že nejsem super sofistikovaný knihkupec, takže nemám mnoho Book s, a proto každý Book objekt může mít pouze jeden z těchto tří stavů.

nejprve bych mohl začít tím, že budu mít tři různé sloupce, které budou reprezentovat každý z těchto stavů:

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

ale tohle mi přijde trochu … směšné. Vždycky budu mít dva prázdné sloupce. Tento kód mě má rád:

alternativně bych mohl kombinovat všechny tyto sloupce do jednoho a použít některé pomocné metody, které vracejí booleovské hodnoty, když je volám na instanci a 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

No, teď mám jeden sloupec, takže je to lepší. Ale to je stále tak opakující se, ošklivý, a neefektivní. Nebojte se, bude to opravdu dobré.

dotaz na vaše malé srdce

implementace enum je velmi jednoduchá. Nejprve přidejte makro do své třídy:

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

Všimněte si, že mám atribut status roztříděný do tří různých možností. Skutečnost, že vypadají jako symboly v poli, není chybou – každý z těchto symbolů je ve skutečnosti spojen s jeho indexem. Takže in_stock bude odkazováno svým indexovým číslem 0, out_of_stock 1 a ordered 2.

Dále přidejte do migrace sloupec, který umožní ActiveRecord enum provádět vaše dotazy:

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

chci, aby všechny mé Book objekty byly při vytváření výchozí na stav in_stock, takže jsem do svého sloupce přidal default: 0. Přidání výchozího nastavení je vždy dobrý způsob, jak udržet svůj kód defenzivní.

Nyní, pokud chci vytvořit objekt Book a zkontrolovat jeho stav:

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 >

jděte do toho a přejděte nahoru, pokud mi nevěříte-slibuji, že jsem žádnou z těchto metod neudělal! Enum mi je dal, fo zdarma. Co se tu vlastně děje? No, ne mnohem víc než ActiveRecord mapující celé číslo odpovídající indexům symbolů, které jsme poskytli v makro poli enum.

naše databáze obsahuje pouze jeden sloupec, který ukládá všechny tyto informace: status. Tento sloupec obsahuje řádky, které jsou buď 1, 2 nebo 3. ActiveRecord vytáhne skutečné symboly, které odpovídají těmto indexům pole, a vrátí je, současně vytváří rozsah in_stock, out_of_stock a ordered. A třešnička na dortu: všechny pomocné metody, které jsou pro nás v procesu okamžitě generovány!

tipy a triky

Enums vám hodně flexibility. Například, hrál jsem si s in_stock rozsah mého Book objekt vytvořit konkrétní metodu třídy, která by objednala tři nejlepší nejnovější knihy přidané do mého inventáře:

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

další věc k zapamatování je, že nemůžete použít stejné názvy pro různé enumy stejné třídy:

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

rozhodně to nedělejte – to vyvolá chybu ActiveRecord!

obrovskou výhodou používání ENUM je jejich příspěvek k rychlosti a výkonu vaší aplikace. Je dobře známo, že je mnohem levnější ukládat data jako celé číslo do paměti, spíše než jako hodnotu řetězce. Enums toho využívají, přesto vám umožní používat všechny metody ActiveRecord, které znáte a milujete.

takže můžete mít svůj lidsky čitelný a zábavný programový kód, aniž byste obětovali jakoukoli rychlost a výkon, který potřebujete k uložení a přístupu k vašim informacím. Myslím, že sny se opravdu splní.

tl; dr?

Napsat komentář Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Nejnovější příspěvky

  • O nás – Gandolfo Helin & Fountain Literary Management
  • 5 Věcí, které byste měli vědět o Shalane Flanagan
  • Rolling Stone
  • kožní toxicita
  • Sergej Tcherepnin-Artadia
  • Jak se vyrovnat se sociálním stresem a tlakem
  • které plemeno koní je nejchytřejší?
  • kyselina křemičitá (Si(OH)4) má významný vliv na atomový absorpční signál hliníku měřený atomovou absorpční spektrometrií grafitové pece (GFAAS)
  • vysvětlení našich Smarts Part 8-Self Smart
  • Sadie T. M. Alexander (1898-1989)

Archivy

  • Březen 2022
  • Únor 2022
  • Leden 2022
  • Prosinec 2021
  • Listopad 2021

Základní informace

  • Přihlásit se
  • Zdroj kanálů (příspěvky)
  • Kanál komentářů
  • Česká lokalizace
  • 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