Je suis à essayer de comprendre la meilleure façon de concevoir un rails de modèle. Pour les fins de l'exemple, disons que je suis en train de construire une base de données de caractères, qui peuvent avoir différents des attributs fixes. Par exemple:
Character
- Morality (may be "Good" or "Evil")
- Genre (may be "Action", "Suspense", or "Western")
- Hair Color (may be "Blond", "Brown", or "Black")
... et ainsi de suite.
Ainsi, pour le modèle de Personnage il y a plusieurs attributs où je veux en gros de fixer une liste de choix possibles.
Je veux que les utilisateurs soient en mesure de créer un personnage, et dans la forme que je veux chercher un de chacune des options disponibles. Je veux aussi être capable de laisser les utilisateurs de la recherche à l'aide de chacun de ces attributs... ( c'est à dire, "Montrez-moi les Personnages qui sont "Bons", de la "Suspense" genre, et ont 'Marron' cheveux).
Je peux penser à un couple de façons de le faire...
1: Créer une chaîne de caractères pour chaque attribut et de valider la participation limitée.
Dans ce cas, je voudrais définir une colonne de type chaîne "Moralité" sur la table de caractères, alors une constante de classe avec les options spécifiées dans elle, puis valider à l'encontre de cette constante de classe.
Trouver de bons personnages serait comme Character.where(:morality=>'Good')
.
C'est simple et efficace, l'inconvénient est que si je voulais ajouter un peu plus de détails pour l'attribut, par exemple, une description de "Bons" et "méchants", et une page où les utilisateurs pourraient afficher tous les personnages pour une morale.
2: Créer un modèle pour chaque attribut
Dans ce cas - Character belongs_to Morality
, il y aurait un Morality
modèle moralities
tableau avec deux dossiers qu'il contient: Morality id:1, name:Good
etc.
Trouver de bons personnages serait comme Morality.find_by_name('Good').characters
... ou
Character.where(:morality=> Morality.find(1)
.
Cela fonctionne bien, mais cela signifie que vous avez plusieurs tables qui n'existent que pour tenir un petit nombre d'attributs prédéfinis.
3: Créer un STI modèle pour les attributs
Dans ce cas, je pourrais faire la même chose que #2, à l'exception de la création d'un "CharacterAttributes" la table, puis la sous-classe pour "MoralityAttribute" et "GenreAttribute" etc. Cela ne fait qu'une seule table pour les nombreux attributs, sinon, il semble sur la même comme idée #2.
Donc, ce sont les trois façons que je peux penser à résoudre ce problème.
Ma question est, comment voulez-vous mettre en oeuvre, et pourquoi?
Voulez-vous utiliser l'une des méthodes ci-dessus, et si oui, lequel? Voulez-vous faire quelque chose de différent? Je serais particulièrement intéressé à entendre les facteurs de performance de l'approche que vous prenez. Je sais que c'est une vaste question, je vous remercie pour toute entrée.
EDIT: Je vais ajouter une Prime de 250 (plus de 10% de ma réputation!!) sur cette question, parce que je ne pouvais vraiment utiliser un peu plus de discussion étendue des avantages / inconvénients / options. Je vais vous donner upvotes à toute personne qui se pèse avec quelque chose de constructif, et si quelqu'un peut me donner un excellent exemple de l'approche qu'ils prennent et POURQUOI il va être intéressant de +250.
Je suis vraiment angoissante sur la conception de cet aspect de mon application et il est maintenant temps pour la mettre en œuvre. Merci d'avance pour toute discussion utile!!
NOTE FINALE:
Merci à tous pour votre réfléchie et intéressante réponses, elles sont toutes bonnes et ont été très utiles pour moi. En fin de compte (arrivant juste avant le prime expiré!) J'ai vraiment apprécié Blackbird07 de réponse. Alors que tout le monde a offert de bonnes suggestions, pour moi, personnellement sa a été la plus utile. Je n'étais pas vraiment au courant de l'idée d'un enum avant, et depuis que la recherche en elle je trouve qu'il résout de nombreux problèmes que j'ai eu dans mon application. J'encourage tout le monde qui découvre que cette question de lire toutes les réponses, il y a beaucoup de bonnes approches proposées.