La mia risposta lunga e tardiva, nemmeno completa, ma una buona spiegazione PERCHÉ odio questo schema, opinioni e persino alcune emozioni:
1) versione breve: Active Record crea un " sottile strato " di " legame forte " tra il database e il codice dell'applicazione. Che non risolve nessun problema logico, nessun problema, nessun problema. IMHO non fornisce NESSUN VALORE, tranne un po 'di zucchero sintattico per il programmatore (che può quindi utilizzare una "sintassi oggetto" per accedere ad alcuni dati, che esiste in un database relazionale). Lo sforzo per creare un po 'di conforto per i programmatori dovrebbe (IMHO ...) meglio essere investito in strumenti di accesso al database di basso livello, ad esempio alcune variazioni di hash_map get_record( string id_value, string table_name, string id_column_name="id" )
metodi semplici, facili, semplici e simili (ovviamente, i concetti e l'eleganza variano notevolmente con il lingua utilizzata).
2) versione lunga: in qualsiasi progetto basato su database in cui avevo il "controllo concettuale" delle cose, ho evitato l'AR, ed è stato un bene. Di solito costruisco un'architettura a strati (prima o poi dividi il tuo software in strati, almeno in progetti di dimensioni medio-grandi):
A1) il database stesso, le tabelle, le relazioni, anche un po 'di logica se il DBMS lo consente (anche MySQL è cresciuto ora)
A2) molto spesso, c'è più di un archivio dati: file system (i blob nel database non sono sempre una buona decisione ...), sistemi legacy (immagina te stesso "come" si accederà, molte varietà possibili .. ma questo è non è il punto ...)
B) livello di accesso al database (a questo livello, i metodi degli strumenti, gli helper per accedere facilmente ai dati nel database sono molto graditi, ma AR non fornisce alcun valore qui, tranne un po 'di zucchero sintattico)
C) livello degli oggetti dell'applicazione: gli "oggetti dell'applicazione" a volte sono semplici righe di una tabella nel database, ma la maggior parte delle volte sono comunque oggetti composti e hanno una logica più elevata collegata, quindi investire tempo in oggetti AR a questo livello è semplicemente inutile , una perdita di tempo prezioso per i programmatori, perché il "valore reale", la "logica superiore" di quegli oggetti deve essere implementato in cima agli oggetti AR, comunque - con e senza AR! E, ad esempio, perché si desidera avere un'astrazione di "Oggetti voce di registro"? Il codice logico dell'app li scrive, ma dovrebbe essere in grado di aggiornarli o eliminarli? sembra sciocco, ed App::Log("I am a log message")
è più facile da usare di alcune grandezze rispetto ale=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();
. E ad esempio: l'utilizzo di un "Oggetto voce di registro" nella vista registro nella tua applicazione funzionerà per 100, 1000 o anche 10000 righe di registro, ma prima o poi dovrai ottimizzare - e scommetto che nella maggior parte dei casi, dovrai solo usa quella piccola e bellissima istruzione SQL SELECT nella logica della tua app (che rompe totalmente l'idea AR ..), invece di racchiudere quella piccola istruzione in frame di idee AR fissi rigidi con un sacco di codice che avvolge e nasconde. Il tempo sprecato con la scrittura e / o la creazione di codice AR avrebbe potuto essere investito in un'interfaccia molto più intelligente per leggere elenchi di voci di registro (molti, molti modi, il cielo è il limite). I programmatori dovrebbero osare inventare nuove astrazioni per realizzare la loro logica applicativa che si adatta all'applicazione prevista e non reimplementare stupidamente schemi stupidi, che suona bene a prima vista!
D) la logica dell'applicazione: implementa la logica dell'interazione degli oggetti e della creazione, eliminazione e elenco (!) Di oggetti della logica dell'applicazione (NO, queste attività raramente dovrebbero essere ancorate negli oggetti della logica dell'applicazione stessa: il foglio di carta sulla scrivania lo dice hai i nomi e le posizioni di tutti gli altri fogli nel tuo ufficio? dimentica i metodi "statici" per elencare gli oggetti, è sciocco, un pessimo compromesso creato per far sì che il modo di pensare umano si adatti a [alcuni non tutti-AR-framework-like -] Pensiero AR)
E) l'interfaccia utente - beh, quello che scriverò nelle righe seguenti è molto, molto, molto soggettivo, ma nella mia esperienza, i progetti basati su AR spesso trascuravano la parte dell'interfaccia utente di un'applicazione - il tempo era sprecato per creare astrazioni oscure . Alla fine tali applicazioni hanno sprecato molto tempo ai programmatori e sembrano applicazioni da programmatori per programmatori, inclini alla tecnologia dentro e fuori. I programmatori si sentono bene (duro lavoro finalmente fatto, tutto finito e corretto, secondo il concetto sulla carta ...), e i clienti "devono solo imparare che deve essere così", perché questo è "professionale" .. ok, scusa, sto divagando ;-)
Certo, tutto questo è soggettivo, ma è la mia esperienza (escluso Ruby on Rails, potrebbe essere diverso, e non ho esperienza pratica con questo approccio).
Nei progetti a pagamento, ho spesso sentito la richiesta di iniziare con la creazione di alcuni oggetti "record attivi" come elementi costitutivi per la logica dell'applicazione di livello superiore. Nella mia esperienza, questo è molto spessoera una sorta di scusa per il fatto che il cliente (una società di sviluppo di software nella maggior parte dei casi) non aveva una buona idea, una visione d'insieme, una panoramica di ciò che il prodotto dovrebbe essere finalmente. Quei clienti pensano in strutture rigide ("nel progetto dieci anni fa ha funzionato bene .."), possono arricchire le entità, possono definire relazioni tra entità, possono scomporre le relazioni di dati e definire la logica di base dell'applicazione, ma poi si fermano e consegnalo a te, e pensa che sia tutto ciò di cui hai bisogno ... spesso mancano di un concetto completo di logica dell'applicazione, interfaccia utente, usabilità e così via e così via ... mancano di una visione d'insieme e non amano dettagli, e vogliono che tu segua quel modo di fare AR, perché .. beh, perché, ha funzionato in quel progetto anni fa, tiene le persone occupate e silenziose? Non lo so. Ma i "dettagli" separare gli uomini dai ragazzi, o .. com'era lo slogan pubblicitario originale? ;-)
Dopo molti anni (dieci anni di esperienza di sviluppo attivo), ogni volta che un cliente menziona uno "schema di registrazione attivo", il mio campanello d'allarme suona. Ho imparato a cercare di riportarli a quella fase concettuale essenziale , farli riflettere due volte, provarli a mostrare le loro debolezze concettuali o semplicemente evitarli del tutto se non hanno discernimento (alla fine, sai, un cliente che non lo fa ancora sa quello che vuole, forse pensa anche di sapere ma non lo fa, o cerca di esternalizzare gratuitamente il lavoro di concetto a ME, mi costa molte ore, giorni, settimane e mesi preziosi del mio tempo, vivere è troppo breve ...).
Quindi, finalmente: QUESTO è il motivo per cui odio quello stupido "schema di registrazione attivo", e lo faccio e lo eviterò quando possibile.
EDIT : lo chiamerei anche No-Pattern. Non risolve alcun problema (i modelli non sono pensati per creare zucchero sintattico). Crea molti problemi: la radice di tutti i suoi problemi (menzionati in molte risposte qui ..) è che nasconde solo il buon vecchio SQL ben sviluppato e potente dietro un'interfaccia che è estremamente limitata dalla definizione dei modelli.
Questo modello sostituisce la flessibilità con lo zucchero sintattico!
Pensaci, quale problema ti risolve l'AR?