Minha resposta longa e tardia, nem mesmo completa, mas uma boa explicação POR QUE odeio esse padrão, opiniões e até algumas emoções:
1) versão resumida: Active Record cria uma " camada fina " de " ligação forte " entre o banco de dados e o código do aplicativo. O que não resolve nenhum problema lógico, nenhum problema, nenhum problema. IMHO ele não fornece NENHUM VALOR, exceto algum açúcar sintático para o programador (que pode então usar uma "sintaxe de objeto" para acessar alguns dados, que existem em um banco de dados relacional). O esforço para criar algum conforto para os programadores deve (IMHO ...) melhor ser investido em ferramentas de acesso a banco de dados de baixo nível, por exemplo, algumas variações de simples, fácil, simpleshash_map get_record( string id_value, string table_name, string id_column_name="id" )
métodos e semelhantes (é claro, os conceitos e elegância variam muito com o linguagem utilizada).
2) versão longa: em qualquer projeto baseado em banco de dados onde eu tivesse o "controle conceitual" das coisas, evitei o RA, e isso era bom. Eu geralmente construo uma arquitetura em camadas (mais cedo ou mais tarde você divide seu software em camadas, pelo menos em projetos de médio a grande porte):
A1) o próprio banco de dados, tabelas, relações, até mesmo alguma lógica se o SGBD permitir (o MySQL também está crescido agora)
A2) muitas vezes, há mais do que um armazenamento de dados: sistema de arquivos (blobs no banco de dados nem sempre são uma boa decisão ...), sistemas legados (imagine "como" eles serão acessados, muitas variedades possíveis .. mas isso é não é o ponto ...)
B) camada de acesso ao banco de dados (neste nível, métodos de ferramentas, auxiliares para acessar facilmente os dados no banco de dados são muito bem-vindos, mas AR não fornece nenhum valor aqui, exceto algum açúcar sintático)
C) camada de objetos de aplicativo: "objetos de aplicativo" às vezes são linhas simples de uma tabela no banco de dados, mas na maioria das vezes são objetos compostos de qualquer maneira, e têm alguma lógica superior anexada, então investir tempo em objetos AR neste nível é simplesmente inútil , uma perda de tempo precioso dos codificadores, porque o "valor real", a "lógica superior" desses objetos precisa ser implementada em cima dos objetos AR, de qualquer maneira - com e sem AR! E, por exemplo, por que você deseja ter uma abstração de "Objetos de entrada de log"? O código lógico do aplicativo os grava, mas deve ter a capacidade de atualizá-los ou excluí-los? parece bobo, e App::Log("I am a log message")
algumas magnitudes são mais fáceis de usar do quele=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. E por exemplo: usar um "objeto de entrada de registro" na visualização de registro em seu aplicativo funcionará para 100, 1000 ou mesmo 10.000 linhas de registro, mas mais cedo ou mais tarde você terá que otimizar - e aposto que na maioria dos casos, você apenas use aquela pequena e bonita instrução SQL SELECT na lógica do seu aplicativo (que quebra totalmente a ideia de AR ...), em vez de embrulhar essa pequena instrução em rígidos quadros de ideias de AR fixos com muito código embrulhando e escondendo-o. O tempo que você perdeu escrevendo e / ou construindo código AR poderia ter sido investido em uma interface muito mais inteligente para ler listas de entradas de log (de muitas maneiras, o céu é o limite). Os codificadores devem ousar inventar novas abstrações para realizar a lógica de sua aplicação que se encaixe na aplicação pretendida e não reimplementar estupidamente padrões bobos, que pareça bom à primeira vista!
D) a lógica do aplicativo - implementa a lógica de objetos de interação e criação, exclusão e listagem (!) De objetos lógicos do aplicativo (NÃO, essas tarefas raramente devem ser ancoradas nos próprios objetos lógicos do aplicativo: a folha de papel em sua mesa diz você os nomes e localizações de todas as outras planilhas em seu escritório? esqueça os métodos "estáticos" para listar objetos, isso é bobo, um mau compromisso criado para fazer a maneira humana de pensar se encaixar em [alguns-não-todos-AR-framework-like -] AR pensando)
E) a interface do usuário - bem, o que vou escrever nas linhas a seguir é muito, muito, muito subjetivo, mas, na minha experiência, os projetos que se baseiam em AR muitas vezes negligenciam a parte da interface do usuário de um aplicativo - tempo foi perdido na criação de abstrações obscuras . No final, tais aplicativos desperdiçaram muito tempo dos programadores e parecem aplicativos de programadores para programadores, inclinados à tecnologia por dentro e por fora. Os codificadores se sentem bem (trabalho duro enfim feito, tudo acabado e correto, de acordo com o conceito no papel ...), e os clientes "só tem que aprender que precisa ser assim", porque isso é "profissional" .. ok, desculpe, estou divagando ;-)
Bem, admito que tudo isso é subjetivo, mas é minha experiência (Ruby on Rails excluído, pode ser diferente, e eu não tenho nenhuma experiência prática com essa abordagem).
Em projetos pagos, muitas vezes ouvi a demanda para começar com a criação de alguns objetos de "registro ativo" como um bloco de construção para a lógica de aplicativo de nível superior. Na minha experiência, com frequênciaera uma espécie de desculpa para o cliente (uma empresa de desenvolvimento de software na maioria dos casos) não ter um bom conceito, uma visão ampla, uma visão geral do que o produto deveria ser. Esses clientes pensam em quadros rígidos ("no projeto há dez anos funcionava bem ..."), eles podem dar corpo a entidades, podem definir relações de entidades, podem quebrar relações de dados e definir lógicas básicas de aplicação, mas então param e entregá-lo a você, e acho que isso é tudo de que você precisa ... muitas vezes falta-lhes um conceito completo de lógica de aplicativo, interface de usuário, usabilidade e assim por diante ... eles não têm a visão ampla e não gostam do detalhes, e eles querem que você siga aquele jeito de RA das coisas, porque ... bem, por que funcionou naquele projeto anos atrás, mantém as pessoas ocupadas e em silêncio? Eu não sei. Mas os "detalhes" separar os homens dos meninos, ou ... como era o slogan do anúncio original? ;-)
Depois de muitos anos (dez anos de experiência em desenvolvimento ativo), sempre que um cliente menciona um "padrão de registro ativo", meu alarme toca. Eu aprendi a tentar levá-los de volta à fase essencial da concepção , deixá-los pensar duas vezes, tentar mostrar suas fraquezas conceituais ou simplesmente evitá-los se eles não forem discernentes (no final, você sabe, um cliente que ainda não sabe sabe o que quer, talvez até pense que sabe, mas não sabe, ou tenta externalizar o conceito de trabalho para MIM de graça, me custa muitas horas, dias, semanas e meses preciosos do meu tempo, a vida é muito curta ...).
Então, finalmente: ISTO é porque eu odeio aquele "padrão de registro ativo" idiota, e eu odeio e evitarei isso sempre que possível.
EDIT : Eu até chamaria isso de No-Pattern. Não resolve nenhum problema (os padrões não têm como objetivo criar açúcar sintático). Isso cria muitos problemas: a raiz de todos os seus problemas (mencionados em muitas respostas aqui ..) é que ele apenas esconde o bom e velho SQL bem desenvolvido e poderoso por trás de uma interface que é pela definição de padrões extremamente limitada.
Este padrão substitui a flexibilidade por açúcar sintático!
Pense nisso, qual problema o RA resolve para você?