Was genau ist Arel in Rails 3.0?


86

Ich verstehe, dass es ein Ersatz für ActiveRecord ist und dass es Objekte anstelle von Abfragen verwendet.

Aber...

warum ist das besser

Werden Objekte / Abfragen "einfacher" zu erstellen sein?

Wird dies zu effizienteren SQL-Abfragen führen?

Wird es mit allen wichtigen DBs kompatibel sein? - Ich gehe davon aus, dass es so sein wird.

Wird es einfacher / schwieriger sein, mit gespeicherten Prozeduren zu arbeiten?

Antworten:


182

Was genau ist Arel in Rails 3.0?

Es ist ein Objektmodell für eine Algebra relationaler Abfrageoperatoren.

Ich verstehe, dass es ein Ersatz für ActiveRecord ist

Nein, ist es nicht. Es ist ein Ersatz für die manuelle Erstellung von SQL-Abfragen in Zeichenfolgen. Es ist eine allgemeine Abfrageebene, die ActiveRecord zugrunde liegt , sie kann jedoch auch als Grundlage für DataMapper verwendet werden.

Wenn es ein Ersatz für irgendetwas ist, ist es ein Ersatz für Ambition. Sie können es sich auch als Ruby-Version der LINQ-Standardabfrageoperatoren oder der SQLAlchemy von Python vorstellen. (Tatsächlich zitiert der Autor sowohl LINQ als auch SQLAlchemy ausdrücklich als Inspirationen.)

Oder Sie können es als Ersatz für named_scopes sehen. In der Tat ist ARel so ziemlich die Verwirklichung der Idee, dass "jede Abfrage eine ist named_scope". Und, whaddayaknow: Beide wurden von demselben Typen geschrieben.

und dass es Objekte anstelle von Abfragen verwendet.

Nein, es werden Objekte als Abfragen verwendet.

warum ist das besser

Ruby ist eine objektorientierte Sprache, keine stringorientierte Sprache. Aus diesem GrundAllein aus ist es sinnvoll, Abfragen als Objekte anstelle von Zeichenfolgen darzustellen. Das Erstellen eines geeigneten Objektmodells für Abfragen anstelle der Verwendung von Zeichenfolgen für alles bietet Ihnen nahezu dieselben Vorteile wie das Erstellen eines geeigneten Objektmodells für ein Buchhaltungssystem anstelle der Verwendung von Zeichenfolgen für alles.

Ein weiterer großer Vorteil ist, dass ARel eine tatsächliche Algebra von Abfrageoperatoren implementiert . Mit anderen Worten, ARel kennt die mathematischen Regeln zum Erstellen und Erstellen von Abfragen. Wenn Sie zwei Zeichenfolgen verketten, von denen jede eine gültige SQL-Abfrage enthält, ist das Ergebnis wahrscheinlich keine gültige SQL-Abfrage. Oder, noch schlimmer, es handelt sich um eine gültige SQL-Abfrage, die jedoch keinen Sinn ergibt oder etwas völlig anderes tut, als Sie denken. Das kann man nie mit ARel passieren. (Dies ist, was der Artikel, auf den ich unten verweise, mit "geschlossen unter Komposition" bedeutet.)

Werden Objekte / Abfragen "einfacher" zu erstellen sein?

Ja. Wie oben erwähnt, ist es beispielsweise viel einfacher, komplexere Abfragen aus einfacheren Teilen zu erstellen.

Wird dies zu effizienteren SQL-Abfragen führen?

Ja. Die Tatsache, dass ARel über ein geeignetes Objektmodell für die Abfragen verfügt, bedeutet, dass es Optimierungen für diese Abfragen durchführen kann, lange bevor jemals eine tatsächliche SQL-Abfrage generiert wird.

Wird es mit allen wichtigen DBs kompatibel sein? - Ich gehe davon aus, dass es so sein wird.

Ja. Tatsächlich habe ich oben immer über SQL gesprochen, aber tatsächlich kann eine relationale Abfragealgebra Abfragen für so ziemlich alles generieren. Siehe auch LINQ oder Ambition als Beispiele: Beide können SQL, LDAP, ActiveResource, CouchDB, Amazon, Google usw. mit derselben Syntax abfragen.

Die vielleicht beste Diskussion darüber, was ARel ist und warum Nick Kallen schrieb, ist der treffend benannte Artikel Warum Arel? von Nick Kallen selbst. Hinweis: Der Artikel enthält eine milde Fachsprache für Mathematik und Informatik, aber genau das ist der Punkt: ARel hat einige starke Grundlagen in Mathematik und Informatik. Diese Grundlagen verleihen ihm seine starken Eigenschaften.


Hervorragende Antwort. Ich hatte den von Ihnen geposteten Link gelesen und war ihm größtenteils gefolgt. Tatsächlich machte der Comp-Sci-Teil Sinn, aber wie er in Schienen eingebaut wurde, hatte ich Probleme. Für mich ist es viel sinnvoller, dass es das handgefertigte SQL (oder was auch immer) ersetzt und dass AR in 3.0 darauf aufbaut. Ich hatte verschiedene Eindrücke für Leute, die es besser wissen sollten, und diese Antwort ist brillant in ihrer einfachen und präzisen Erklärung jeder der obigen Fragen.
Will

Ich habe eine Folgefrage. Sie haben oben LDAP, AMZ usw. erwähnt. Ich gehe davon aus, dass ARel derzeit (basierend auf Rails / Arel auf Github) nicht über diese Fähigkeit verfügt, sondern nur über das Potenzial. dh bis jemand diesen Teil implementiert. Das klingt aber super aufregend.
Will

2
@ Will - Ich denke, Sie müssen warten, bis jemand diese funkigeren Fähigkeiten entwickelt. Oder machen Sie selbst einen Sprung, sollten Sie ihn brauchen?
Mike Woodhouse

1
+1, obwohl der Link tot ist; naive Suche hat keinen aktuellen Link gefunden.
Dave Newton

@ DaveNewton: Anscheinend ist es weg. Es gibt einige zwischengespeicherte Kopien, z. B. bmark.us/bmark/readable/913ff84fc0dcdc
Jörg W Mittag

19

ARel ist leider direkt an die Generierung von SQL gebunden und daher für die Anforderungen von DataMapper ungeeignet.

Ich würde sagen, dass ARel ein explizites Abfragemodell für ActiveRecord ist, das SQL-Abfragen für RDBMS generiert und optimiert.

DataMapper hingegen ist ein echter Mapper für Daten und kann bereits mit nicht relationalen Datenspeichern verbunden werden. In Zukunft wird DataMapper wahrscheinlich eine separate Bibliothek namens Veritas enthalten, die relationale Funktionen für Daten bereitstellen soll, die aus JEDEM Datenspeicher stammen, nicht nur aus RDBMS.


2
Warum erhielt dies -1?
Jeriko

10
Ich bin der Betreuer von DataMapper, und was die Wissenstheorie sagt, ist wahr. ARel kann in seiner aktuellen Implementierung nicht unter DataMapper verwendet werden, da es nur einen Teil der Funktionen bereitstellt, die für die Arbeit mit den über 40 von DM unterstützten Datenspeichern erforderlich sind. Meiner Meinung nach ist die aktuelle Implementierung eng an die SQL-Generierung gekoppelt, und es wird viel Arbeit erfordern, die API / Interna für die Arbeit mit Datenspeichern zu reparieren, die sich wesentlich von einem RDBMS unterscheiden. ARel ist ein Fortschritt, kann aber derzeit keine Grundlage für mehr als ActiveRecord bilden.
dkubb

1

Arel in Rails 3 erstellt Beziehungsobjekte, bei denen die Datenbank erst abgefragt wird, wenn Sie sie benötigen. Viel effizienter.

Es ist auch natürlicher (sobald Sie sich daran gewöhnt haben), was wirklich die große Stärke von Rails ist.


0

Eigentlich habe ich eine Videoserie über ActiveRelation gestartet.

Das erste allgemeine Tutorial kann unter http://Innovative-Studios.com/#pilot eingesehen werden


Das Video hat mir auch gefallen. War ein bisschen grundlegend, aber ich habe ein paar zusätzliche neue Informationen gesammelt. Möchte nachfolgende Videos sehen!
Purplejacket
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.