Comment gérer les valeurs enum dans les rails 4
J'ai donc un subscription
table dans ma base de données.
Je voudrais avoir un state
colonne qui va avoir l'une des valeurs suivantes
Valid
Invalid
Cancelled
In Trial
Non Renewing
Future
Quelqu'un peut m'expliquer comment utiliser ces valeurs comme des valeurs enum dans les rails 4?
source d'informationauteur Giri
Vous devez vous connecter pour publier un commentaire.
De crédit: https://hackhands.com/ruby-on-enums-queries-and-rails-4-1/
Déclarer un enum attribut où les valeurs de la carte d'entiers dans la base de données, mais peut être interrogé par nom. Exemple:
Étendues en fonction de l'autorisait les valeurs de l'enum domaine seront également fournis. Avec l'exemple ci-dessus, il faudra créer un actif et archivé portée.
Vous pouvez définir la valeur par défaut de la base de données de la déclaration, comme:
Bonne pratique est de laisser le premier déclaré statut par défaut.
Enfin, il est également possible de mapper explicitement la relation entre l'attribut et de la base de données de type entier avec une valeur de Hachage:
Noter que lorsqu'un Tableau est utilisé, de l'implicite correspondance entre les valeurs de la base de données des entiers est dérivé de l'ordre, les valeurs apparaissent dans le tableau. Dans l'exemple, :active est mappé à 0 comme c'est le premier élément, et :l'archivage est mappé à 1. En général, le i-ème élément est mappé à i-1 dans la base de données.
Par conséquent, une fois qu'une valeur est ajoutée à la enum tableau, sa position dans le tableau doit être maintenu, et les nouvelles valeurs ne doivent être ajoutés à la fin du tableau. Pour supprimer les valeurs, les explicite de Hachage de la syntaxe doit être utilisé.
Dans de rares cas, vous pourriez avoir besoin pour accéder à la cartographie directement. Les mappages sont exposés par le biais d'une méthode de classe avec le pluriel du nom d'attribut:
Utiliser cette méthode de la classe lorsque vous avez besoin de connaître la valeur ordinale d'un enum:
Où les conditions sur un enum attribut doit utiliser la valeur ordinale d'un enum.
Plus d'infos: http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html
Vous pouvez utiliser le gem appelé Flux de travail. Il vous permet d'utiliser vos propres statuts et gracieusement à gérer les transitions entre les états. Je l'ai utilisé sur de nombreux Rails3 et les Rails 4 apps.
Exemple de la documentation.
Et plus tard:
Edit: Ma réponse ici, ne pas utiliser de ActiveRecord la magie des enums. Ce que je propose ci-dessous fonctionne pour n'importe quelle bibliothèque DB (comme Suite), et il m'arrive de penser un peu plus robuste. Par exemple, il ne dépend pas de commande automatique de valeurs, et il utilise les contraintes de clé étrangère dans les SGBDR pour vous assurer que votre valeur est valide (à la différence de la ActiveRecord solution). Cependant, il n'est pas les Rails idiomatiques de la méthodologie. Voir Giri réponse (un copier/coller de la page de documentation) pour l'idiomatiques réponse.
Créer un
states
table dans votre base de données avec ces valeurs de chaîne peuplée avec un ID unique, par exempleUtiliser une norme étrangère-clés de l'association dans votre
subscription
table de la référence à une entrée destates
.Dans vos modèles, créer un
State
classe avec des constantes correspondant à l'Id, par exemple:Maintenant, vous êtes garanti que votre table de données est valide, et b) vous avez un choix de références comme demander
subscriptions