2

J'ai un modèle, article.
Chaque article a de nombreux traits.
Les traits peuvent être beaucoup de choses différentes:
A SizeTrait
A ToppingsTrait
A FlavorTrait
etcRuby on Rails has_many polymorphe

Comment puis-je mettre en place cette relation dans Ruby on Rails? Dans une application Ruby normale, je pourrais juste utiliser le typage de canard, mais cela doit être stocké dans la base de données.

Il est comme l'inverse de belongs_to avec polymorphes: true

Je voudrais éviter l'héritage de table unique que ces traits, alors qu'ils partagent une interface de type canard, ses fonctionnalités seront très différentes. Cela causerait beaucoup de champs inutilisés dans la table et cela semble être une manière désordonnée et confuse de le faire. Il y a quelques messages à ce sujet sur StackOverflow, mais l'un a une situation différente que la mienne et l'autre a une solution assez douteuse, et je veux voir s'il y en a une meilleure.

+0

Je ne comprends pas pourquoi ne pas utiliser l'héritage de table unique pour ce faire? Si vos traits seront des fonctionnalités très différentes, vous devez les définir dans un modèle différent, non? Ou demandez-vous comment laisser '@ item.traits' pour utiliser les méthodes définies dans différents modèles? –

+0

@Donald Cela semble désordonné car il y aura beaucoup de champs inutilisés si tous les modèles de traits partagent une table. Si c'est la meilleure façon de le faire, c'est comme ça que je le ferai, mais je pensais qu'il y aurait un meilleur moyen. – ThaBullfrog

+0

@Donald Il suffit de relire votre commentaire et tiens à préciser: je veux absolument ceux-ci dans différents modèles. Je préférerais avoir ces modèles dans des tables séparées si possible. – ThaBullfrog

Répondre

1

Vous ne pouvez pas effectuer de jointures sur une association polymorphe. La meilleure approche consiste simplement à s'atteler à l'ITS comme vous l'avez mentionné précédemment. Bien que vous puissiez argumenter que vous aurez plusieurs champs qui seront nuls, au moins les rails seront en mesure de faire des jointures sensibles pour vous aider dans vos requêtes.