C'est plus une question de style, je me demande quelles autres personnes font.
Disons que j'ai un champ dans ma base de données appelé "statut" pour un poteau de blog. Et je veux que cela ait plusieurs valeurs possibles, comme "projet", "En attente d'examen" et "posté", tout comme un exemple. P>
évidemment nous ne voulons pas "Code Hard" dans ces Valeurs magiques à chaque fois, cela ne serait pas sec. P>
Alors, ce que je fais parfois est quelque chose comme ceci: p> puis je peux écrire le code référoir à elle plus tard comme status Cela fonctionne bien, mais il y en a quelques-uns choses que je n'aime pas à ce sujet. p> Je ne sais pas, quelque chose me dit qu'il y a une meilleure façon, mais je voulais juste voir ce que font les autres. Merci! p> p> [: brouillon] code> ou post :: Statut [: brouillon] code> etc. p>
Statut [: quelque chose_that_does_not_exist] code> Il ne jettera pas une erreur, il retourne simplement nul et peut finaliser cela dans la base de données, etc. avant de vous jamais remarquer un bug li>
si quelque_var == Post :: Statut [: Draw] Code> ... Li>
ol>
6 Réponses :
Vous pouvez utiliser une méthode de classe pour soulever une exception sur une clé manquante: potentiellement, vous pouvez également utiliser cette méthode pour stocker les statuts comme entiers dans la base de données en changeant vos chaînes. aux entiers (dans le hachage), convertir vos types de colonne et ajouter un getter et un setter. p> p>
Ceci est un problème courant. Considérez quelque chose comme ceci:
class Post < ActiveRecord::Base symbolize :status end
Je le fais comme ceci:
class Post DRAFT = "draft" AWAITING_REPLY = "awaiting reply" POSTED = "posted" STATUSES = [DRAFT, AWAITING_REPLY, POSTED] validates_inclusion_of :status, :in => STATUSES ... end
Je l'aime, sauf que vous devez ensuite vous y référer plus tard comme Status [0] code> non? Dans ce cas, ce n'est pas tout aussi lisible.
Vous pouvez utiliser HASH.NEW et lui donner un argument de bloc appelé si une clé est inconnue.
irb(main):007:0> Post::STATUS[ :draft ]
=> "draft"
irb(main):008:0> Post::STATUS[ :bogus ]
RuntimeError: Key bogus is unknown
from (irb):2
from (irb):8:in `call'
from (irb):8:in `default'
from (irb):8:in `[]'
from (irb):8
J'aime cette méthode. Pas de dépendances externes.
Jetez un coup d'oeil au attribut_mapper gemme.
Il y a un Article associé qui montre comment vous pouvez gérer le problème de manière prétendante, comme celle-ci ( emprunté à l'article): p> ... qui a l'air plutôt élégant. p> p> p>
Plutôt cool. C'est dommage qu'il ne les regarde pas au cas où vous auriez plusieurs attributs, comme Statut [: projet] vs quelque chose_else [: brouillon] mais globalement, cela pourrait être la meilleure solution que j'ai vue
Même s'il s'agit d'un ancien poste, vous pouvez utiliser la STATUS = {
:draft => "draft",
:awaiting_review => "awaiting review",
:posted => "posted"
}
STATUS.fetch(:draft) #=> "draft"
STATUS.fetch(:invalid_key) #=> KeyError: key not found: invalid_key