2

J'ai un modèle "Task" qui va HABTM de nombreux "TaskTargets". Toutefois, en ce qui concerne TaskTargets, j'écris la classe TaskTarget de base qui est abstraite (autant que possible dans Rails). TaskTarget sera sous-classé par différentes conceptualisations de tout ce qui peut être la cible d'une tâche. Donc dire, sous-système logiciel, site client, salle de bain, etc ...Création d'une base de données et d'une relation lors du sous-classement d'un modèle

La conception des classes ici est assez simple, mais où je suis un hic, c'est comment je vais relier tout cela ensemble et comment je vais avoir des rails manipuler ces relations. Ma première pensée est que je vais avoir une table TaskTarget qui contiendra les champs communs de base (nom, description ...). Il aura alors également une relation polymorphe avec une table spécifique au type de données que la classe d'implémentation encapsule. Cela implique que les données pour une instance d'une classe implémentant TaskTarget seront trouvées dans deux tables.

La deuxième approche consiste à créer une relation HABTM polymorphique entre la tâche et les sous-classes de TaskTarget dont je pensais que je pourrais réutiliser le nom de la table TaskTarget pour la table de jointure.

Option 2 Je suppose que c'est le plus robuste, mais peut-être qu'il me manque quelque chose. Merci pour toute aide et bien sûr je demande juste de m'assurer que je l'ai fait correctement, une fois!

Répondre

4

Je pense que les deux approches (facilement) à votre disposition dans Rails sont:

1) Single Table Inheritance: Vous créez une seule table TaskTarget qui a tous les domaines que chaque sous-classe pourrait vouloir. Vous ajoutez ensuite un champ "type" qui stocke le nom de la classe, et Rails fera le reste pour vous. Voir le ActiveRecord api docs pour plus d'informations, en particulier la section "Héritage de table unique".

2) Concrete Table Inheritance: Il n'y a pas de table pour la classe TaskTarget de base. Au lieu de cela, créez simplement une table pour chaque classe concrète dans votre hiérarchie avec seulement les champs nécessaires à cette classe.

La première option facilite la réalisation de tâches telles que «Afficher tous les TaskTargets, quelle que soit leur sous-classe» et réduit le nombre de tables. Il est un peu plus difficile de dire exactement ce qu'une sous-classe peut faire, par opposition à une autre, et si vous avez un lot de TaskTargets, je suppose que finalement les avoir tous dans une table pourrait être un problème de performance.

La seconde option permet d'obtenir un schéma plus clair, plus facile à lire, et chaque classe fonctionnera à peu près comme n'importe quel modèle ActiveRecord normal. Cependant, la jonction entre toutes les tables TaskTarget peut être fastidieuse, en particulier lorsque vous ajoutez d'autres sous-classes à l'avenir. La mise en œuvre des associations polymorphes nécessaires peut également impliquer une complexité supplémentaire.

L'option la mieux adaptée à votre situation dépend des opérations que vous devez implémenter et des caractéristiques de votre ensemble de données.

+0

Je n'aime vraiment pas l'approche de table unique. Bien qu'il résume parfaitement la relation, je soupçonne que cela deviendra un cauchemar à bien des égards. Je penche vers ma deuxième solution avec une relation polymorphique entre Task et les différents TaskTargets. Cela semble être l'approche la plus courante de Rails. Je serais toujours le bienvenu pour tout type de discussion ou d'autres réponses à ce sujet! Merci! –

+0

Eh bien, quelle hiérarchie anticipez-vous? S'il s'agit d'un ensemble relativement petit de classes avec beaucoup de chevauchement dans les champs requis, je pense que Single Table Inheritance peut être le moyen le plus simple, car cela signifie que vous n'avez pas à manipuler les associations polymorphes et les handles Rails la plupart des bits difficiles pour vous. D'un autre côté, si vous pensez que le nombre de sous-classes peut être très important, alors oui, la table TaskTarget pourrait devenir incontrôlable. –

+0

Je pense que le nombre de sous-classes pourrait augmenter. Leur raison d'être est de pouvoir encapsuler des données qui ne sont pas toujours communes entre les différentes cibles des tâches. –