Question

J'ai une application, construite à l'aide de MVC, qui produit une vue fournissant des informations récapitulatives sur un certain nombre de modèles.De plus, certains calculs sont effectués sur les différents ensembles de données.

Il n'existe pas de modèle unique clair (qui correspond au moins à une table) qui semble avoir du sens comme point de départ pour cela, donc les différents résumés sont extraits des modèles contributifs dans le contrôleur, transmis à la vue et les calculs y sont effectués. .

Mais il semble que, eh bien, sale.Mais les contrôleurs sont censés être légers, n’est-ce pas ?Et la logique métier ne devrait pas être dans les vues, telle que je l'ai présente.

Alors, où ces informations devraient-elles être rassemblées ?Un nouveau modèle, qui ne correspond pas à une table ?Une fonction/module de bibliothèque ?Ou autre chose?

(Bien que je considère cela principalement comme une question d'architecture/de modèle, je travaille dans Rails, FWIW.)

Modifier:De bonnes réponses partout, et beaucoup de consensus, ce qui est rassurant.J'ai "accepté" la réponse que j'ai faite pour garder le lien vers Railscasts en haut.Je suis en retard dans mon visionnage Railscast - quelque chose que je ferai de gros efforts pour rectifier !

Était-ce utile?

La solution

Comme Brian l'a dit, vous pouvez créer un autre modèle qui regroupe le travail à effectuer.Il y a un super Railscast sur la façon de faire ce genre de chose.

HTH

Autres conseils

Les contrôleurs n'ont pas besoin d'être mappés à des modèles ou des vues spécifiques.Votre modèle n'a pas besoin d'être mappé un à un avec une table de base de données.C'est un peu l'idée du cadre.Séparation des préoccupations qui peuvent toutes être testées isolément.

Pourquoi ne pas créer un modèle qui n'hérite pas ActiveRecord::Base et exécutez la logique là-bas (pensez à la classe Cart dans Agile...With Rails).

Les contrôleurs ne doivent pas nécessairement être que poids léger.

Cependant, si vous avez des calculs qui reposent uniquement sur le(s) modèle(s), vous avez probablement simplement besoin d'une sorte de wrapper de modèle pour que les modèles effectuent le calcul.Vous pouvez ensuite le placer dans l'API de la vue afin que la vue obtienne le résultat final.

Vous ne voulez pas que la logique soit visible.Cependant, vous êtes libre de créer une vue de base de données.Sauf que plutôt que de le créer côté base de données, créez-le en tant que nouveau modèle.Cela vous permettra d'effectuer vos calculs et votre logique réelle là-bas, en un seul endroit.La douleur d'essayer de garder vos points de vue synchronisés par rapport à.la "douleur" unique de créer le nouveau modèle...Je vote pour un nouveau modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top