Ma réponse longue et tardive, même pas complète, mais une bonne explication POURQUOI je déteste ce schéma, ces opinions et même certaines émotions:
1) version courte: Active Record crée une " fine couche " de " liaison forte " entre la base de données et le code de l'application. Ce qui ne résout aucun problème logique, aucun problème quelconque, aucun problème du tout. À mon humble avis, il ne fournit AUCUNE VALEUR, à l'exception du sucre syntaxique pour le programmeur (qui peut alors utiliser une «syntaxe d'objet» pour accéder à certaines données, qui existe dans une base de données relationnelle). L'effort pour créer un certain confort pour les programmeurs devrait (à mon humble avis) être mieux investi dans des outils d'accès aux bases de données de bas niveau, par exemple certaines variantes de simples, faciles, simpleshash_map get_record( string id_value, string table_name, string id_column_name="id" )
méthodes et similaires (bien sûr, les concepts et l'élégance varient considérablement avec le langue utilisée).
2) version longue: dans tous les projets basés sur des bases de données où j'avais le "contrôle conceptuel" des choses, j'évitais la RA, et c'était bien. Je construis généralement une architecture en couches (vous divisez tôt ou tard votre logiciel en couches, au moins dans les projets de taille moyenne à grande):
A1) la base de données elle-même, les tables, les relations, même un peu de logique si le SGBD le permet (MySQL est également développé maintenant)
A2) très souvent, il y a plus qu'un magasin de données: système de fichiers (les blobs dans la base de données ne sont pas toujours une bonne décision ...), systèmes hérités (imaginez "comment" ils seront accédés, de nombreuses variétés possibles .. mais c'est pas le point ...)
B) couche d'accès à la base de données (à ce niveau, les méthodes d'outils, les aides pour accéder facilement aux données de la base de données sont les bienvenues, mais AR ne fournit aucune valeur ici, sauf quelques sucres syntaxiques)
C) couche d'objets d'application: les «objets d'application» sont parfois de simples lignes d'une table dans la base de données, mais la plupart du temps, ils sont composés objets toute façon, et ont une logique plus élevée attachée, donc investir du temps dans des objets AR à ce niveau est tout simplement inutile , une perte de temps précieux pour les codeurs, car la "valeur réelle", la "logique supérieure" de ces objets doit être implémentée au-dessus des objets AR, de toute façon - avec et sans AR! Et, par exemple, pourquoi voudriez-vous avoir une abstraction des "objets d'entrée de journal"? Le code logique de l'application les écrit, mais cela devrait-il permettre de les mettre à jour ou de les supprimer? semble idiot, et certaines magnitudes sont plus faciles à utiliser . Et par exemple: l'utilisation d'un "objet Entrée de journal" dans la vue du journal de votre application fonctionnera pour 100, 1000 ou même 10000 lignes de journal, mais tôt ou tard, vous devrez optimiser - et je parie que dans la plupart des cas, vous n'aurez qu'à utilisez cette belle petite instruction SQL SELECT dans la logique de votre application (ce qui rompt totalement l'idée AR ...), au lieu d'encapsuler cette petite instruction dans des cadres d'idées AR fixes rigides avec beaucoup de code enveloppant et masquant. Le temps que vous avez perdu avec l'écriture et / ou la construction de code AR aurait pu être investi dans une interface beaucoup plus intelligente pour lire des listes d'entrées de journal (de nombreuses façons, le ciel est la limite).App::Log("I am a log message")
le=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
pour réaliser leur logique d'application qui correspond à l'application prévue, et ne pas réimplémenter bêtement des schémas idiots, ça sonne bien à première vue!
D) la logique de l'application - implémente la logique des objets en interaction et de la création, de la suppression et de la liste (!) Des objets de la logique de l'application (NON, ces tâches doivent rarement être ancrées dans les objets de la logique de l'application elle-même: la feuille de papier sur votre bureau le dit-elle vous les noms et les emplacements de toutes les autres feuilles de votre bureau? Oubliez les méthodes "statiques" pour lister les objets, c'est idiot, un mauvais compromis créé pour que la façon humaine de penser s'intègre dans [certains-not-all-AR-framework-like -] Pensée AR)
E) l'interface utilisateur - eh bien, ce que j'écrirai dans les lignes suivantes est très, très, très subjectif, mais d'après mon expérience, les projets qui reposaient sur la RA négligeaient souvent la partie UI d'une application - du temps était perdu à créer des abstractions obscures . En fin de compte, de telles applications ont fait perdre beaucoup de temps aux codeurs et se sentent comme des applications de codeurs pour codeurs, orientés vers la technologie à l'intérieur et à l'extérieur. Les codeurs se sentent bien (travail acharné enfin fait, tout est terminé et correct, selon le concept sur papier ...), et les clients "doivent juste apprendre que ça doit être comme ça", parce que c'est "professionnel" .. ok, désolé, je m'égare ;-)
Eh bien, certes, tout cela est subjectif, mais c'est mon expérience (Ruby on Rails exclu, cela peut être différent, et je n'ai aucune expérience pratique avec cette approche).
Dans les projets payants, j'ai souvent entendu la demande de commencer par créer des objets «enregistrement actif» comme élément constitutif de la logique d'application de niveau supérieur. Dans mon expérience, ce bien en évidence souventétait une sorte d'excuse pour que le client (une société de développement de logiciels dans la plupart des cas) n'ait pas un bon concept, une vue d'ensemble, un aperçu de ce que le produit devrait finalement être. Ces clients pensent dans des cadres rigides ("dans le projet il y a dix ans, ça a bien fonctionné .."), ils peuvent étoffer des entités, ils peuvent définir des relations d'entités, ils peuvent décomposer les relations de données et définir la logique de base de l'application, mais ensuite ils s'arrêtent et vous le remettez, et pensez que c'est tout ce dont vous avez besoin ... ils manquent souvent d'un concept complet de logique d'application, d'interface utilisateur, de convivialité, etc., ils n'ont pas la vue d'ensemble et ils manquent d'amour pour le détails, et ils veulent que vous suiviez cette façon de faire AR, parce que ... eh bien, pourquoi, cela a fonctionné dans ce projet il y a des années, cela garde les gens occupés et silencieux? Je ne sais pas. Mais les "détails" séparer les hommes des garçons, ou… comment était le slogan original de la publicité? ;-)
Après de nombreuses années (dix ans d'expérience dans le développement actif), chaque fois qu'un client mentionne un «modèle d'enregistrement actif», ma sonnette d'alarme sonne. J'ai appris à essayer de les ramener à cette phase de conception essentielle , de les laisser réfléchir à deux fois, de les essayer pour montrer leurs faiblesses conceptuelles ou simplement de les éviter du tout s'ils ne sont pas conscients (au final, vous savez, un client qui ne le fait pas encore) savoir ce qu'il veut, peut-être même pense qu'il sait mais ne le fait pas, ou essaie d'externaliser gratuitement le travail de concept vers MOI, me coûte beaucoup d'heures, de jours, de semaines et de mois précieux de mon temps, vivre est trop court ...).
Donc, enfin: CECI TOUT est la raison pour laquelle je déteste ce "modèle d'enregistrement actif" idiot, et je le fais et je l'éviterai autant que possible.
EDIT : J'appellerais même cela un No-Pattern. Cela ne résout aucun problème (les motifs ne sont pas destinés à créer du sucre syntaxique). Cela crée de nombreux problèmes: la racine de tous ses problèmes (mentionnés dans de nombreuses réponses ici ..) est qu'il cache juste le bon vieux SQL bien développé et puissant derrière une interface qui est par la définition des modèles extrêmement limitée.
Ce modèle remplace la flexibilité par du sucre syntaxique!
Pensez-y, quel problème la RA résout-elle pour vous?