ActiveRecord ist wirklich cool, weil es die Datenbank 'abstrahiert', so dass wir jede Datenbank handhaben können.
In der Programmierung ist das schwierigste Problem, verschiedene Systeme auf konsistente Weise zu behandeln.
Datenbanken sind besonders so.
MySQL hat diese Syntax
PostgreSQL hat jene Syntax
SQLite ist wieder anders
Oracle ist eine ganz andere Welt
Wenn man all diese direkt behandeln will, muss der Entwickler sich an die DB-Syntax, SQL-Dialekte, Indexierungseigenschaften, Typsysteme und Transaktionsverarbeitung erinnern.
Aber Rails hat all diese Probleme mit nur einer Schicht namens ActiveRecord gelöst.
Das ist genau Abstraktion.
Was ist Abstraktion? (Konzeptuell ohne Analogie)
Der Kern der Abstraktion ist einfach.
Komplexe Systeme in eine einzige gemeinsame Schnittstelle (API) zu vereinheitlichen.
Das bedeutet, dass, auch wenn die Funktionsweise verschieden ist, die Verwendung vereinheitlicht wird.
Abstraktion ist eine der mächtigsten Techniken in der Ingenieurswelt.
Was hat ActiveRecord abstrahiert?
Es gibt nur eine richtige Antwort.
Die SQL-Syntax und das Verhalten, die für jede DB unterschiedlich sind, wurden durch die Manipulation von Ruby-Objekten vereinheitlicht.
Mit anderen Worten,
"Die 'verschiedenen Welten' der DB wurden in 'eine Welt namens Ruby-Code' umgewandelt."
Wie mächtig ist das? Lassen Sie uns das anhand eines Beispiels zeigen
Angenommen, wir möchten eine Liste von Benutzern abrufen.
Wenn Sie direkt SQL verwenden:
MySQL
SELECT * FROM `users` ORDER BY `created_at` DESC LIMIT 10;
PostgreSQL
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;
Oracle
SELECT * FROM users WHERE ROWNUM <= 10 ORDER BY created_at DESC;
Die Syntax ist ganz anders. LIMIT ist anders, die Abfrage-Regeln sind anders, die Schlüsselwörter sind anders.
Aber wenn Sie ActiveRecord verwenden?
Rails
User.order(created_at: :desc).limit(10)
Ende.
ActiveRecord basiert auf diesem einen Ruby-Code und wandelt ihn automatisch in das entsprechende SQL für jede DB um.
Für MySQL gibt es MySQL-spezifisches SQL
Für PostgreSQL gibt es PostgreSQL-spezifisches SQL
Für SQLite gibt es SQLite-spezifisches SQL
Das bedeutet, der Entwickler muss nur Ruby kennen.
Der tatsächliche Wert der Abstraktion
Die Vorteile, die ActiveRecord durch Abstraktion erzielt, sind wie folgt.
1) Der Austausch der DB ist frei
Angenommen, Sie wechseln von SQLite zu PostgreSQL.
Normalerweise:
Alle SQLs ändern
Alle Typen ändern
Alle Transaktionsverarbeitungen ändern
Alle LIMIT/OFFSET-Syntax ändern
Aber in Rails...
Es ist nicht notwendig, etwas zu ändern.
Ändern Sie einfach den Adapter in der Rails-Konfiguration.
adapter: postgresql
Der Code bleibt gleich:
User.where(active: true)
Das funktioniert einwandfrei.
2) Sie können entwickeln, ohne etwas über die DB zu wissen
ActiveRecord übernimmt automatisch:
Datenspeicherung
Bearbeitung
Abfrage
Löschen
Transaktionen
Beziehungen
Fremdschlüsselverarbeitung
JOIN-Optimierung
Der Entwickler muss nur dies tun.
user = User.find(5)
user.update(name: "Neuer Name")
Aber tatsächlich wird im Hintergrund in der DB automatisch ein komplexes SQL ausgeführt:
UPDATE users SET name = 'Neuer Name' WHERE id = 5;
Der Entwickler muss das nicht wissen.
3) Es ermöglicht ein modellzentriertes Denken (Model-driven Thinking)
SQL ist datenzentriertes Denken.
Aber Rails ist objektorientiertes Denken.
Das bedeutet, dass wir das User-Modell wie ein echtes Objekt behandeln.
user.posts
Diese eine Zeile behandelt alles, von JOIN über WHERE bis hin zur INDEX-Interpretation...
Dank ActiveRecord kann sich der Entwickler auf das Design der Geschäftslogik konzentrieren.
Wenn Sie die Abstraktion verstehen, wird deutlich, wie genial ActiveRecord ist
Schauen Sie sich den folgenden Ruby-Code an.
users = User.where("age > ?", 18).order(:created_at)
Wenn dieser Code ausgeführt wird, passiert intern Folgendes:
Überprüfen der Struktur des Modells
Überprüfen des DB-Typs
Sicheres Escapen der WHERE-Bedingung
Anwenden der Sortierreihenfolge
Umwandeln in SQL-Syntax, die die jeweilige DB versteht
Ausführen des SQL
Die zurückgegebenen Werte in Objekte (User) umwandeln
All diese Schritte sind für den Entwickler nicht bewusst erforderlich.
Mit anderen Worten,
ActiveRecord = Ein Werkzeug, das die DB als eine andere Welt vollständig in die Ruby-Welt integriert.
Dank dieser Abstraktion können Rails-Entwickler, auch wenn sie keine DB-Experten sind, mit nur wenigen Zeilen Ruby den gesamten Datensatz des Dienstes verwalten.
Fazit - ActiveRecord ist kein ORM, sondern ein 'DB-Abstraktion Engine'
Warum ist ActiveRecord ein "echter cooler Typ"?
Der Grund ist einfach.
ActiveRecord lässt den Entwickler alle Unterschiede und Regeln der Komplexität jeder DB vergessen.
Und ermöglicht es, alle Arten von DBs auf dieselbe Weise mit der einzigen Sprache Ruby zu behandeln.
Das ist die Kraft der Abstraktion.
Das ist die Philosophie von Rails.
Das ist die Antwort darauf, warum ActiveRecord ein herausragendes ORM ist.