Skip to content

Archives

  • März 2022
  • Februar 2022
  • Januar 2022
  • Dezember 2021
  • November 2021

Categories

  • Keine Kategorien
Calor Blogfever risk

Wörter und Code

admin - Januar 14, 2022

NERD ALERT: Ich liebe Datenbanken. Gott, sie sind einfach fantastisch. Nur wenige Dinge bereiten mir so viel Freude wie ein leeres Whiteboard und ein paar komplizierte Join-Tabellen, die skizziert werden müssen. Aber es gibt auch eine Kunst zu verstehen, wie man mit Daten umgeht – besonders wenn man eine Menge davon hat.

Das Hauptproblem, auf das Menschen mit Daten stoßen, ist erstens, wie Sie sie speichern und zweitens, wie Sie sie abrufen, wenn Sie sie tatsächlich benötigen! Das klingt aber nicht super kompliziert, oder? Falsch. Datenbanken wachsen vertikal, nicht horizontal, und sie wachsen hella schnell. An einem bestimmten Punkt wirkt sich die Art und Weise, wie Sie Ihre Daten speichern, direkt darauf aus, wie Sie sie abrufen!

Viele Rubyisten schreiben verschiedene Hilfsmethoden, um ihre Abfragen für sie durchzuführen. Aber das ist Rails Land, was bedeutet, dass wir Black Rails Magic zur Verfügung haben. Und mit dem Aufkommen von Rails 4.1 hat diese Magie jetzt einen Namen: enum .

  • Holen Sie sich Yo Enum auf
  • Mehrere Spalten?! Dafür hat keiner Zeit!
  • Fragen Sie Ihr kleines Herz ab
  • Tipps und Tricks
  • tl;dr?

Holen Sie sich Yo Enum auf

Wenn Rails 4.1 wurde vor weniger als einem Jahr veröffentlicht, es kam mit einer Reihe neuer Funktionen heraus. Eine davon war ActiveRecord Enums , die im Wesentlichen viele Methoden und überflüssigen Code ausschnitten.

Mit ActiveRecord-Enums können Sie die Attribute eines ActiveRecord-Objekts in Rails so bearbeiten, dass die Werte eines Attributs Ganzzahlen in der Datenbank zugeordnet werden (im Gegensatz zu Zeichenfolgen) und dennoch auch nach Namen abgefragt werden können. Wenn dir das alles irgendwie verrückt klingt, dann ist es das! Enums sind ziemlich cool, weil sie die Flexibilität einer Zeichenfolge haben, aber die Geschwindigkeit und Effizienz einer Ganzzahl. Sie können Werte in einer großen Datenbank mit einer Ganzzahl nachschlagen, aber Sie können auch Attribute als Zeichenfolge aktualisieren und hinzufügen. Oh – Sie erhalten auch eine Reihe von Methoden KOSTENLOS!

Wie funktioniert diese Magie genau? Ich dachte, du würdest nie fragen!

Mehrere Spalten?! Dafür hat keiner Zeit!

Um zu demonstrieren, wie ActiveRecord-Enums implementiert werden, verwende ich weiterhin die E-Commerce-Buchladen-App der letzten Woche als Beispiel. Ich habe also diese Book -Objekte in meinem Speicher und möchte ihren Status verfolgen: entweder in stock, out of stock oder ordered. Der Einfachheit halber werden wir so tun, als wäre ich kein hoch entwickelter Buchhändler, daher habe ich nicht viele Book s, und daher kann jedes Book Objekt immer nur einen dieser drei Zustände haben.

Ich könnte zunächst mit drei verschiedenen Spalten beginnen, um jeden dieser Zustände darzustellen:

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

Aber das scheint irgendwie … lächerlich. Ich werde immer zwei leere Spalten haben. Dieser Code hat mich alle wie:

Alternativ könnte ich alle diese Spalten zu einer kombinieren und einige Hilfsmethoden verwenden, die boolesche Werte zurückgeben, wenn ich sie in einer Instanz von a aufrufe 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

Nun, jetzt habe ich eine Spalte, also ist das besser. Aber das ist immer noch so repetitiv, hässlich und ineffizient. Keine Sorge, es wird bald richtig gut.

Fragen Sie Ihr kleines Herz ab

Die Implementierung von Enum ist ziemlich einfach. Fügen Sie zuerst das Makro zu Ihrer Klasse hinzu:

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

Sie werden feststellen, dass ich mein Attribut status in meine drei verschiedenen Optionen eingeteilt habe. Die Tatsache, dass sie wie Symbole in einem Array aussehen, ist kein Fehler – jedes dieser Symbole ist tatsächlich seinem Index zugeordnet. Also wird in_stock durch seine Indexnummer 0, out_of_stock durch 1 und ordered durch 2 referenziert.

Fügen Sie als Nächstes Ihrer Migration eine Spalte hinzu, in der ActiveRecord enum Ihre Abfragen ausführen kann:

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

Ich möchte, dass alle meine Book -Objekte beim Erstellen standardmäßig den Status in_stock haben, daher habe ich meiner Spalte einen default: 0 hinzugefügt. Das Hinzufügen eines Standardwerts ist immer eine gute Möglichkeit, Ihren Code defensiv zu halten.

Wenn ich nun ein Book -Objekt erstellen und dessen Status überprüfen möchte:

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 >

Scrollen Sie nach oben, wenn Sie mir nicht glauben – ich verspreche, ich habe keine dieser Methoden entwickelt! Enum gab sie mir, FO KOSTENLOS. Also, was ist eigentlich hier los? Nun, nicht viel mehr als ActiveRecord, das die Ganzzahl zuordnet, die den Indizes der Symbole entspricht, die wir im Enum-Makroarray bereitgestellt haben.

Unsere Datenbank enthält nur eine Spalte, in der alle diese Informationen gespeichert sind: status. Diese Spalte enthält Zeilen, die alle entweder 1, 2 oder 3 sind. ActiveRecord ruft die tatsächlichen Symbole ab, die diesen Array-Indizes entsprechen, und gibt sie zurück, wobei gleichzeitig ein Bereich in_stock , out_of_stock und ordered erstellt wird. Und das Sahnehäubchen auf dem Kuchen: alle Hilfsmethoden, die dabei sofort für uns generiert werden!

Tipps und Tricks

Enums geben Ihnen viel Flexibilität. Zum Beispiel habe ich mit dem in_stock -Bereich meines Book -Objekts herumgespielt, um eine bestimmte Klassenmethode zu erstellen, mit der die drei neuesten Bücher bestellt werden, die meinem Inventar hinzugefügt wurden:

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

Eine andere Sache, an die Sie sich erinnern sollten, ist, dass Sie nicht dieselben Namen für verschiedene Aufzählungen derselben Klasse verwenden können:

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

Tun Sie dies auf keinen Fall – dies löst einen ActiveRecord-Fehler aus!

Ein großer Vorteil bei der Verwendung von Enums ist ihr Beitrag zur Geschwindigkeit und Leistung Ihrer Anwendung. Es ist eine bekannte Tatsache, dass es viel billiger ist, Daten als Ganzzahl im Speicher und nicht als Zeichenfolgenwert zu speichern. Aufzählungen nutzen dies aus, ermöglichen es Ihnen jedoch, alle ActiveRecord-Methoden zu verwenden, die Sie kennen und lieben.

So können Sie Ihren für Menschen lesbaren und unterhaltsam zu programmierenden Code haben, ohne die Geschwindigkeit und Leistung zu beeinträchtigen, die Sie zum Speichern und Zugreifen auf Ihre Informationen benötigen. Ich denke, Träume werden wirklich wahr.

tl;dr?

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Neueste Beiträge

  • Über uns – Gandolfo Helin & Fountain Literary Management
  • 5 Wissenswertes über Shalane Flanagan
  • Rolling Stone
  • Hauttoxizität
  • Sergei Tcherepnin – Artadia
  • Wie man mit sozialem Stress und Druck umgeht
  • Welche Pferderasse ist die klügste?
  • Kieselsäure (Si (OH)4) hat einen signifikanten Einfluss auf das Atomabsorptionssignal von Aluminium, gemessen mit der Graphitofen-Atomabsorptionsspektrometrie (GFAAS)
  • Explaining Our Smarts Part 8 – Self Smart
  • Sadie T. M. Alexander (1898-1989)

Archive

  • März 2022
  • Februar 2022
  • Januar 2022
  • Dezember 2021
  • November 2021

Meta

  • Anmelden
  • Feed der Einträge
  • Kommentare-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