Cos'è esattamente Arel in Rails 3.0?


86

Capisco che è un sostituto per ActiveRecord e che utilizza oggetti invece di query.

Ma...

perché è meglio?

gli oggetti / le query saranno "più facili" da creare?

porterà a query SQL più efficienti?

sarà compatibile con tutti i principali DB? - Suppongo che lo farà.

sarà più facile / difficile da usare con le stored procedure?

Risposte:


182

Cos'è esattamente Arel in Rails 3.0?

È un modello a oggetti per un'algebra di operatori di query relazionali.

Capisco che sia un sostituto per ActiveRecord

No, non lo è. È un sostituto per la creazione manuale di query SQL in stringhe. È un livello di query comune alla base di ActiveRecord, ma può anche essere utilizzato come supporto per DataMapper, ad esempio.

Se è un sostituto per qualcosa, è un sostituto per Ambition. Oppure puoi pensarla come una versione Ruby degli operatori di query standard LINQ o dell'alchimia SQL di Python. (In effetti, l'autore cita esplicitamente sia LINQ che SQLAlchemy come ispirazione.)

Oppure puoi vederlo come un sostituto di named_scopes. In effetti, ARel è praticamente la realizzazione dell'idea che "ogni query è una named_scope". E, whaddayaknow: entrambi sono stati scritti dallo stesso ragazzo.

e che utilizza oggetti invece di query.

No, utilizza gli oggetti come query.

perché è meglio?

Ruby è un linguaggio orientato agli oggetti, non un linguaggio orientato alle stringhe. Per questo motivo da solo , ha senso per rappresentare le query come oggetti invece di stringhe. La creazione di un modello a oggetti appropriato per le query invece di utilizzare stringhe per tutto offre praticamente gli stessi vantaggi offerti dalla creazione di un modello a oggetti appropriato per un sistema di contabilità invece di utilizzare stringhe per tutto.

Un altro grande vantaggio è che ARel implementa un'effettiva algebra di operatori di query. In altre parole, ARel conosce le regole matematiche per la costruzione e la composizione delle query. Se concatenate due stringhe, ognuna delle quali contiene una query SQL valida, probabilmente il risultato non sarà una query SQL valida. O, peggio ancora, è una query SQL valida, ma che non ha senso, o che fa qualcosa di completamente diverso da quello che pensi che faccia. Questo non può mai accadere con ARel. (Questo è ciò che l'articolo a cui collego di seguito significa "chiuso in composizione".)

gli oggetti / le query saranno "più facili" da creare?

Sì. Ad esempio, come ho detto sopra, è molto più facile costruire query più complesse da parti più semplici.

porterà a query SQL più efficienti?

Sì. Il fatto che ARel disponga di un modello a oggetti appropriato per le query significa che può eseguire ottimizzazioni su tali query molto prima che generi una query SQL effettiva.

sarà compatibile con tutti i principali DB? - Suppongo che lo farà.

Sì. In effetti, ho sempre parlato di SQL sopra, ma in realtà un'algebra di query relazionale può generare query praticamente per tutto. Ancora una volta, vedi LINQ o Ambition come esempi: entrambi possono eseguire query su SQL, LDAP, ActiveResource, CouchDB, Amazon, Google, ... tutti con la stessa sintassi.

Forse la migliore discussione su cosa sia ARel e perché Nick Kallen ha scritto è l'articolo dal nome appropriato Why Arel? dallo stesso Nick Kallen . Nota: l'articolo contiene un po 'di gergo matematico e informatico mite, ma questo è esattamente il punto: ARel ha delle solide basi in matematica e informatica, quelle basi sono ciò che gli conferisce le sue potenti proprietà.


Ottima risposta. Avevo letto il link che hai pubblicato e l'ho seguito per la maggior parte. In effetti la parte comp sci aveva senso, ma il modo in cui è stata incorporata nei binari era dove avevo i problemi. Per me ha molto più senso che sostituisca l'SQL fatto a mano (o qualsiasi altra cosa) e quindi che AR sia costruito sopra di esso nella 3.0. Avevo avuto impressioni diverse per le persone che dovrebbero saperne di più e questa risposta è brillante nella sua spiegazione semplice e precisa di ogni domanda sopra.
Will

Ho una domanda di follow-up. Hai menzionato LDAP, AMZ, ecc. Sopra, presumo che attualmente (basato su rails / arel su github) ARel non abbia quella capacità, solo il potenziale? cioè finché qualcuno non implementa quella parte. Questo però sembra super eccitante.
Will

2
@ Will - Penso che dovrai aspettare che qualcuno sviluppi quelle capacità più stravaganti. O provaci tu stesso, dovresti averne bisogno?
Mike Woodhouse,

1
+1, sebbene il collegamento sia morto; la ricerca ingenua non ha trovato il collegamento corrente.
Dave Newton

@ DaveNewton: A quanto pare, non c'è più. Ci sono alcune copie cache in giro, ad esempio bmark.us/bmark/readable/913ff84fc0dcdc
Jörg W Mittag,

19

ARel, purtroppo, è direttamente legato alla generazione di SQL e quindi non è adatto alle esigenze di DataMapper.

Il modo in cui lo metterei è che ARel è un modello di query esplicito per ActiveRecord che genera e ottimizza le query SQL per RDBMS.

DataMapper, d'altra parte, è un vero mappatore di dati e può già interfacciarsi con archivi dati non relazionali. In futuro DataMapper includerà probabilmente una libreria separata chiamata Veritas, che ha lo scopo di fornire funzionalità relazionali ai dati provenienti da QUALSIASI archivio dati, non solo RDBMS.


2
Perché questo ha ricevuto -1?
Jeriko

10
Sono il manutentore di DataMapper e quello che dice la teoria è vero. ARel, nella sua implementazione attuale, non può essere utilizzato sotto DataMapper perché fornisce solo un sottoinsieme delle funzionalità necessarie per lavorare con gli oltre 40 datastore supportati da DM. IMHO l'attuale implementazione è strettamente collegata alla generazione SQL e ci vorrà molto lavoro per correggere l'API / gli interni per lavorare con datastore sostanzialmente diversi da un RDBMS. ARel è un passo avanti, ma al momento non può costituire una base per più di ActiveRecord.
dkubb

1

Arel in Rails 3 crea oggetti relazione in cui il database non viene interrogato finché non ne hai bisogno. Molto più efficiente.

È anche più naturale (una volta che ci si abitua) che è davvero la grande forza di Rails.


0

In realtà ho iniziato una serie di video su ActiveRelation.

Il primo tutorial generale può essere visualizzato su http://Innovative-Studios.com/#pilot


Anche a me è piaciuto il video. Era un po 'basilare, ma ho raccolto alcune nuove informazioni extra. Vorrei vedere i video successivi!
Purplejacket
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.