Há algumas críticas válidas no ActiveRecord. Como sempre, o tio Bob resume perfeitamente :
O problema que tenho com o Active Record é que ele cria confusão sobre esses dois estilos muito diferentes de programação. Uma tabela de banco de dados é uma estrutura de dados. Ele expôs dados e nenhum comportamento. Mas um registro ativo parece ser um objeto. Possui dados "ocultos" e comportamento exposto. Coloquei a palavra "oculto" entre aspas, porque os dados não estão ocultos. Quase todos os derivados do ActiveRecord exportam as colunas do banco de dados através de acessadores e mutadores. De fato, o Active Record deve ser usado como uma estrutura de dados.
Por outro lado, muitas pessoas colocam métodos de regras de negócios em suas classes do Active Record; o que os faz parecer objetos. Isso leva a um dilema. De que lado da linha o Active Record realmente cai? É um objeto? Ou é uma estrutura de dados?
A Wikipedia resume as críticas em uma preocupação de testabilidade :
Na OOP, o conceito de encapsulamento está frequentemente em desacordo com o conceito de separação de preocupações. De um modo geral, os padrões que favorecem a separação de preocupações são mais adequados para testes de unidade isolados, enquanto os padrões que favorecem o encapsulamento têm APIs mais fáceis de usar. O Active Record favorece fortemente o encapsulamento a ponto de testar sem um banco de dados ser bastante difícil.
Especificamente para a implementação do Ruby on Rails, Gavin King escreve (ênfase minha):
Neste ponto, a maioria dos desenvolvedores está pensando, ok, então como diabos eu devo saber quais atributos uma empresa possui olhando meu código? E como meu IDE pode preenchê-los automaticamente? Obviamente, o pessoal do Rails tem uma resposta rápida para essa pergunta. Oh, basta iniciar o seu cliente de banco de dados e procurar no banco de dados !. Então, assumindo que você conhece as regras de maiúsculas e pluralização automagicas do ActiveRecord / perfeitamente /, você poderá adivinhar os nomes dos atributos da sua própria classe Company e digitá-los manualmente.
Também na implementação do Ruby on Rails, John Januszczak escreve (ênfase minha):
PROBLEMA Nº 1: MÉTODOS ESTÁTICOS
...
Alguns diriam que o uso de métodos estáticos simplesmente equivale a programação procedural e, portanto, é um projeto pobre orientado a objetos. Outros diriam que métodos estáticos são a morte da testabilidade.
PROBLEMA # 2: CONFIGURAÇÕES GLOBAIS DE CONFIGURAÇÃO
...
Portanto, não há injeção de dependência na classe Account no meu exemplo e, por extensão, nas instâncias de Account. Como todos já sabemos, procurar coisas é muito, muito ruim!
Mais alguns recursos sobre por que o ActiveRecord e o ORM geralmente são considerados um antipadrão:
O ActiveRecord sempre pareceu um anti-padrão extremamente útil , mas eu concordo que ele vai contra o SRP e, adicionalmente, contra o princípio da inversão de dependência.