Skip to content

Archives

  • mars 2022
  • février 2022
  • janvier 2022
  • décembre 2021
  • novembre 2021

Categories

  • Aucune catégorie
Calor Blogfever risk

Mots et Code

admin - janvier 14, 2022

ALERTE NERD: J’adore les bases de données. Ils sont tout simplement fantastiques. Peu de choses me donnent autant de joie qu’un tableau blanc vide et quelques tables de jointure complexes qui doivent être esquissées. Mais il y a aussi un art de comprendre comment gérer les données, en particulier lorsque vous en avez une tonne de merde.

Le principal problème que les gens rencontrent avec les données est d’abord de savoir comment les stocker et, deuxièmement, comment les obtenir lorsque vous en avez réellement besoin! Cela ne semble pas super compliqué, non? Faux. Les bases de données se développent verticalement, pas horizontalement, et elles se développent rapidement. À un certain moment, la façon dont vous stockez vos données finit par avoir un impact direct sur la façon dont vous les récupérez!

De nombreux Rubyistes écrivent différentes méthodes d’assistance pour effectuer leurs requêtes. Mais c’est Rails Land, ce qui signifie que nous avons la magie des rails noirs à notre disposition. Et avec l’avènement de Rails 4.1, cette magie a maintenant un nom: enum.

  • Obtenez Yo Enum Sur
  • Plusieurs colonnes ?! Personne N’A Le Temps Pour Ça !
  • Interrogez Votre Petit cœur
  • Trucs et astuces
  • tl; dr?

Obtenez Yo Enum Sur

Lorsque Rails 4.1 est sorti il y a moins d’un an, il est sorti avec un tas de nouvelles fonctionnalités. L’un d’eux était ActiveRecord enums, qui éliminait essentiellement beaucoup de méthodes et de code superflu.

Les énumérations ActiveRecord vous permettent de manipuler les attributs d’un objet ActiveRecord dans des Rails de telle sorte que les valeurs d’un attribut correspondent à des entiers dans la base de données (par opposition aux chaînes), et peuvent également être interrogées par nom. Si tout cela vous semble un peu fou, c’est parce que c’est le cas! Les énumérations sont plutôt cool car elles ont la flexibilité d’une chaîne, mais la vitesse et l’efficacité d’un entier. Vous pouvez rechercher des valeurs dans une énorme base de données à l’aide d’un entier, mais vous pouvez également mettre à jour et ajouter des attributs sous forme de chaîne. Oh – vous obtenez également un tas de méthodes GRATUITEMENT!

Alors, comment fonctionne cette magie, exactement? Je pensais que tu ne demanderais jamais!

Plusieurs colonnes ?! Personne N’A Le Temps Pour Ça !

Pour démontrer comment implémenter ActiveRecord enums, je continuerai à utiliser l’application de librairie de commerce électronique de la semaine dernière comme exemple. J’ai donc ces objets Book dans mon magasin et je veux garder une trace de leur statut: soit in stock, out of stock, ou ordered. Par souci de simplicité, nous prétendrons que je ne suis pas un libraire super sophistiqué, donc je n’ai pas beaucoup de Book s, et donc chaque objet Book ne peut avoir qu’un seul de ces trois états.

Je pourrais d’abord commencer par avoir trois colonnes différentes pour représenter chacun de ces états:

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

Mais cela semble un peuridiculous ridicule. J’aurai toujours deux colonnes vides. Ce code m’a tout comme:

Alternativement, je pourrais combiner toutes ces colonnes en une seule et utiliser des méthodes d’assistance qui renvoient des valeurs booléennes lorsque je les appelle sur une instance de 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

Eh bien, maintenant j’ai une colonne, donc c’est mieux. Mais c’est toujours aussi répétitif, laid et inefficace. Ne t’inquiète pas, ça va bien aller.

Interrogez Votre Petit cœur

La mise en œuvre d’enum est assez simple. Tout d’abord, ajoutez la macro à votre classe:

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

Vous remarquerez que mon attribut status est classé dans mes trois options différentes. Le fait qu’ils ressemblent à des symboles dans un tableau n’est pas une erreur – chacun de ces symboles est en fait associé à son index. Ainsi, in_stock sera référencé par son numéro d’index 0, out_of_stock par 1 et ordered par 2.

Ensuite, ajoutez une colonne à votre migration qui permettra à ActiveRecord enum d’exécuter vos requêtes:

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

Je veux que tous mes objets Book aient un statut in_stock par défaut lorsqu’ils sont créés, j’ai donc ajouté un default: 0 à ma colonne. L’ajout d’une valeur par défaut est toujours un bon moyen de garder votre code défensif.

Maintenant, si je veux créer un objet Book et vérifier son état:

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 >

Allez-y et faites défiler vers le haut si vous ne me croyez pas – je promets que je n’ai fait aucune de ces méthodes! Enum me les a donnés, LIBRES. Alors que se passe-t-il réellement ici? Eh bien, pas beaucoup plus qu’ActiveRecord mappant l’entier correspondant aux index des symboles que nous avons fournis dans le tableau de macro enum.

Notre base de données n’a qu’une seule colonne stockant toutes ces informations : status. Cette colonne a des lignes qui sont toutes 1, 2 ou 3. ActiveRecord extrait les symboles réels qui correspondent à ces index de tableau et les renvoie, créant simultanément une portée in_stock, out_of_stock et ordered. Et la cerise sur le gâteau: toutes les méthodes d’assistance qui sont immédiatement générées pour nous dans le processus!

Trucs et astuces

Les énumérations vous offrent beaucoup de flexibilité. Par exemple, j’ai joué avec la portée in_stock de mon objet Book pour créer une méthode de classe spécifique qui commanderait les trois livres les plus récents ajoutés à mon inventaire:

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

Une autre chose à retenir est que vous ne pouvez pas utiliser les mêmes noms pour différentes énumérations de la même classe:

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

Ne faites certainement pas cela – cela provoquera une erreur ActiveRecord!

Un énorme avantage de l’utilisation des énumérations est leur contribution à la vitesse et aux performances de votre application. C’est un fait bien connu qu’il est beaucoup moins coûteux de stocker des données sous forme d’entier en mémoire, plutôt que sous forme de valeur de chaîne. Les énumérations en profitent, tout en vous permettant d’utiliser toutes les méthodes ActiveRecord que vous connaissez et aimez.

Ainsi, vous pouvez avoir votre code lisible par l’homme et amusant à programmer sans sacrifier la vitesse et les performances dont vous avez besoin pour enregistrer et accéder à vos informations. Je suppose que les rêves se réalisent vraiment.

tl; dr?

Laisser un commentaire Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Articles récents

  • À propos de nous – Gandolfo Helin & Fountain Literary Management
  • 5 Choses à savoir Sur Shalane Flanagan
  • Rolling Stone
  • Toxicité cutanée
  • Sergei Tcherepnine – Artadia
  • Comment faire Face au Stress social et à la pression
  • Quelle Race De Cheval Est La Plus Intelligente?
  • L’acide silicique (Si (OH)4) est une influence significative sur le signal d’absorption atomique de l’aluminium mesuré par spectrométrie d’absorption atomique au four à graphite (GFAAS)
  • Expliquer Notre intelligence Partie 8 – Auto Smart
  • Sadie T. M. Alexander (1898-1989)

Archives

  • mars 2022
  • février 2022
  • janvier 2022
  • décembre 2021
  • novembre 2021

Méta

  • Connexion
  • Flux des publications
  • Flux des commentaires
  • Site de WordPress-FR
  • 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