Mon long et en fin de réponse, même pas complète, mais une bonne explication POURQUOI je déteste ce modèle, les opinions et même de certaines émotions:
1) version courte: Active Record crée une "couche mince" de "la forte liaison" entre la base de données et le code de l'application. Qui résout pas logique, n'importe quoi-des problèmes, pas de problèmes à tous. À mon humble avis il ne fournit pas de VALEUR, à l'exception de certaines sucre syntaxique pour le programmeur (qui peut alors utiliser un objet "syntaxe" pour accéder à certaines données, qui existe dans une base de données relationnelle). L'effort de créer de confort pour les programmeurs devrait (à mon humble avis...) mieux être investi dans des bas au niveau de la base de données, les outils d'accès, par exemple, certaines variations de simple, facile, simple hash_map get_record( string id_value, string table_name, string id_column_name="id" )
et des méthodes similaires (bien sûr, les concepts et l'élégance varie fortement avec la langue utilisée).
2) version longue: Dans une base de données des projets menés par où j'ai eu le "conceptuel de contrôle" des choses, j'ai évité AR, et c'était bon. J'ai l'habitude de construire une architecture en couches (vous tôt ou tard, ne divisez votre logiciel dans les couches, au moins dans un milieu à de grands projets de taille):
A1) la base de données, tables, relations, même une certaine logique si le SGBD permet (MySQL est également cultivé maintenant)
A2) très souvent, il n'est plus qu'un magasin de données: système de fichiers (blob dans la base de données ne sont pas toujours une bonne décision...), les systèmes existants (imaginez-vous "comment" ils seront accessibles, beaucoup de variétés possible.. mais ce n'est pas le point...)
B) l'accès à la base de la couche (à ce niveau, les méthodes de l'outil, des aides pour faciliter l'accès aux données dans la base de données sont les bienvenus, mais AR ne fournit pas de valeur ici, à l'exception de certaines sucre syntaxique)
C) les objets de l'application de la couche: "les objets de l'application" sont parfois de simples lignes d'une table dans la base de données, mais la plupart du temps ils sont composés d'objets de toute façon, et avoir un peu plus de logique attaché, donc, d'investir du temps dans l'AR objets à ce niveau est simplement inutile, du gaspillage des codeurs de temps, parce que la "valeur réelle", le "plus logique" de ces objets doit être mis en œuvre sur le dessus de l'AR objets, de toute façon, avec ou sans AR! Et, par exemple, pourquoi voudriez-vous d'avoir une abstraction de "l'entrée de Journal des objets"? La logique d'application du code écrit mais qui ont la capacité de mettre à jour ou les supprimer? semble stupide, et App::Log("I am a log message")
est certaines grandeurs plus facile à utiliser que le=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. Et pour exemple: à l'aide d'un "Journal de l'entrée de l'objet" dans l'affichage de l'historique de votre demande de travail pour 100, 1000 ou même 10000 lignes de log, mais tôt ou tard, vous aurez à optimiser - et je parie que dans la plupart des cas, vous utilisez cette belle petite instruction SQL SELECT dans votre application logique (qui rompt totalement l'AR idée..), au lieu d'envelopper cette petite phrase en rigide fixe AR idée cadres avec beaucoup de code d'emballage et de le cacher. Le temps que vous avez perdu avec l'écriture et/ou de construction d'AR code aurait pu être investi dans une beaucoup plus intelligent de l'interface pour la lecture des listes des entrées de l' (beaucoup, beaucoup de manières, le ciel est la limite). Les codeurs doivent oser inventer de nouvelles abstractions pour réaliser leur application logique que l'ajustement à la demande, et pas bêtement ré-implémenter idiot modèles, que du bon son, à première vue!
D) l'application de la logique - met en œuvre la logique de l'interaction des objets et de création, de suppression et d'inscription(!) de la logique de l'application des objets (NON, ces tâches doivent rarement être ancré dans la logique de l'application des objets de lui-même: la feuille de papier sur votre bureau vous dire les noms et emplacements de tous les autres feuilles dans votre bureau? oublier "statique" méthodes pour la liste des objets, c'est idiot, un mauvais compromis créé pour faire de la façon humaine de penser ajustement dans [certains-pas-tous-AR-cadre-comme-]AR la pensée)
E) l'interface utilisateur - eh bien, ce que je vais écrire dans les lignes qui suivent est très, très, très subjective, mais dans mon expérience, les projets qui s'appuient sur les AR souvent négligé la partie de l'INTERFACE utilisateur d'une application - temps a été perdu sur la création d'un obscur des abstractions. En fin de compte ces demandes perdu beaucoup de codeurs temps et se sentir comme les applications des programmeurs pour des programmeurs, les tech-inclinée à l'intérieur et à l'extérieur. Les codeurs se sentir bien (dur travail fini, tout est fini et correcte selon le concept sur le papier...), et les clients "juste pour apprendre que ça doit être comme ça", parce que c'est "professionnel".. ok, désolé, je m'égare ;-)
Eh bien, il est vrai, tout cela est subjectif, mais ses mon expérience (Ruby on Rails exclu, il peut être différent, et je n'ai aucune expérience pratique de cette approche).
Dans les projets rémunérés, j'ai souvent entendu la demande de commencer avec la création de quelques "active record" des objets comme un bloc de construction pour le plus haut niveau de la logique d'application. Dans mon expérience, ce ostensiblement souvent était une sorte de prétexte pour que le client (un logiciel de dev de l'entreprise dans la plupart des cas) n'ont pas un bon concept, un grand écran, un aperçu de ce que le produit devrait être finalement. Les clients pensent dans des supports rigides ("dans le projet il y a dix ans ça a bien fonctionné.."), ils peuvent chair entités, ils peuvent définir des entités relations, ils peuvent se décomposer de données de relations et de définir de base de la logique de l'application, mais ensuite, ils ont arrêter et de le remettre à vous, et pense que c'est tout ce dont vous avez besoin... il leur manque souvent un concept complet de la logique de l'application, interface utilisateur, la facilité d'utilisation et ainsi de suite et ainsi de suite... il manque le grand écran et ils manquent d'amour pour les détails, et ils veulent que vous suivez que l'AR sorte de choses, parce que.. eh bien, pourquoi, il a travaillé dans ce projet il y a des années, il garde les personnes occupées et le silence? Je ne sais pas. Mais les "détails" de séparer les hommes et les garçons, ou .. comment a été l'annonce d'origine slogan ? ;-)
Après de nombreuses années (dix ans d'expérience de développement), à chaque fois qu'un client fait mention d'un "modèle d'enregistrement active", mon réveil sonne. J'ai appris à essayer de les faire revenir à ce qui est indispensable conceptionnelle phase, laissez-les réfléchir à deux fois, essayez de montrer leur conceptionnelle faiblesses ou tout simplement les éviter à tout si elles sont undiscerning (à la fin, vous le savez, un client qui ne sait pas encore ce qu'il veut, peut-être même qu'il en sait, mais ne veut pas, ou tente d'externaliser les travaux de concept pour MOI gratuitement, me coûte beaucoup de précieuses heures, des jours, des semaines et des mois de mon temps, vivre c'est trop court ... ).
Donc, finalement: TOUT CELA est pourquoi je déteste ce stupide "active record "modèle", et je ne et éviter autant que possible.
EDIT: je dirais même appeler cela un Pas de Modèle. Il ne résout aucun problème (les modèles ne sont pas destinés à créer sucre syntaxique). Il crée de nombreux problèmes: la racine de tous ses problèmes (mentionné dans beaucoup de réponses ici..), qu' il vient se cache le bon vieux bien développé et puissant SQL derrière une interface qui est par les modèles de la définition extrêmement limitée.
Ce modèle remplace la flexibilité avec le sucre syntaxique!
Pensez à ce sujet, le problème n'AR résoudre pour vous?