Question

Il est judicieux de déplacer la logique du contrôleur dans le modèle. Mais dans tout système complexe, cela conduit invariablement à un fichier très volumineux, même si la majorité des méthodes utilisent une seule couche selon Rails Way.

J'ai eu recours à la division des modèles en d'autres modules et à leur inclusion dans le modèle d'origine, par exemple, model_flags , model_validation , etc. Tout le monde a une meilleure méthode. ?

Modifier: j'ai sélectionné une nouvelle réponse suggérant d'utiliser ActiveConcern. Cet article, Making, est également destiné à quiconque est intéressé par l'organisation du code. ActiveRecord Models Thin devrait grandement aider.

Était-ce utile?

La solution

Je me rends compte que la question est assez ancienne et qu’elle a été marquée comme ayant fait l’objet d’une réponse, mais elle contient toujours du bon jus Google. J’ai donc pensé que cela valait la peine d’être ajouté ...

Rails 3 a introduit ActiveSupport :: Concern, qui peut être utilisé pour modulariser le comportement partagé entre les modèles. Ou, d’ailleurs, pour maigrir des modèles devenus trop gras.

DHP fournit lui-même un exemple succinct et agréable:

https://gist.github.com/1014971

Autres conseils

Je ne ferais pas cela pour plusieurs raisons.

Tout d'abord, vous violez l'hypothèse selon laquelle les choses iront où elles devraient être, ce qui est probablement le plus gros bonus des rails au départ. Une nouvelle personne peut accéder à votre projet et y naviguer assez facilement si vous collez des éléments de modèle dans votre modèle. Si vous le retirez, vous ajoutez simplement un retard et une certaine confusion, en particulier si la seule logique pour supprimer quelque chose dans un module est de réduire la taille du modèle.

Deuxièmement, vous n’en tirez presque rien et vous perdez quelque chose. La taille des fichiers importe peu de nos jours, alors que presque tous les éditeurs et les IDE facilitent la navigation des gros fichiers. Transférer des éléments dans un module vous enlève un peu de cette aisance moderne et vous obligera, ainsi qu'à vos collègues et aux futurs responsables de la maintenance, à parcourir plusieurs fichiers supplémentaires tout en travaillant sur un modèle.

Cela dit, je suppose que la meilleure pratique en matière de rails rigoureux vous dira que si votre modèle est aussi grand et complexe, votre conception est défectueuse et votre modèle représente probablement plusieurs éléments qui pourraient être transformés en modèles distincts plutôt qu'en modules. .

Eh bien, je ne dirais pas que l’un d’entre vous a tort de tout mettre dans un modèle, mais je pense qu’il est également tout à fait valable de pouvoir séparer diverses préoccupations. C'est un compromis au moins.

Et je poste une réponse à ma propre question, car j’ai trouvé le moyen de faire Rails: http://github.com/jakehow/concerned_with

Plus d'informations peuvent être trouvées ici: http://m.onkey.org/2008/ 9/15 / trucs et astuces pour l'enregistrement actif

N'ayant aucune connaissance de votre modèle objet, il est un peu plus difficile de vous conseiller, mais je dirais que si vous êtes absolument convaincu que toutes les validations / associations / rappels doivent être insérés À cet endroit, il existe encore des moyens de prendre en compte les comportements courants. Ainsi, même si je ne déplacerais pas une grande partie du code d'un fichier vers un autre, cela ouvrirait simplement la classe, mais je dirais que l'utilisation de modules / plugins pour décrire les types de comportement courants est une bonne idée. / p>

Par exemple, si vous construisez un flux d'activité sur Facebook et que tout doit générer des "événements", vous voudrez peut-être déplacer ce dernier "Eventable". comportement dans un module qui, lorsqu'il est inclus, définit les associations / validations / etc. Je dirais que cette approche améliorerait réellement la clarté de votre code, car spécifier manuellement ces associations partout n'est pas aussi expressif que déclarer quelque chose comme Eventable, ni comme étant aussi sûr (vous dupliqueriez la logique dans un tas d'endroits et quand la logique change, vous connaissez le reste ...)

Dans l’ensemble, cependant, je dirais de jeter un grand coup d’œil sur votre modèle d’objet. Dans votre suite de tests, si vous remarquez que tous vos tests requièrent beaucoup de configuration, cela peut être un bon indicateur qu'il vous manque quelque chose dans votre modèle d'objet. Encore une fois cependant, un exemple de code serait formidable.

Modules semble raisonnable. Je ne voudrais pas extraire les appels de méthodes (validations, rappels, plugins, etc.) dans des modules, cependant, je limiterais l'extraction à mes propres méthodes.

Et comme toujours, cela vous aiderait de publier un exemple de code. J'ai du mal à imaginer une stratégie générique pour nettoyer les modèles, cela dépend de la nature du code.

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