ActiveRecord es genial por una razón real: porque 'abstrae' la base de datos, podemos manejar cualquier base de datos.
En programación, el problema más difícil es manejar sistemas diferentes de manera consistente.
Las bases de datos son especialmente así.
MySQL tiene esta sintaxis
PostgreSQL tiene aquella sintaxis
SQLite es diferente
Oracle es un mundo completamente diferente
Para manejar todos estos directamente, los desarrolladores deben recordar constantemente la sintaxis de la base de datos, el dialecto SQL, las características de indexación, el sistema de tipos, el manejo de transacciones, etc.
Sin embargo, Rails resolvió todos estos problemas con una sola capa llamada ActiveRecord.
Esto es precisamente la abstracción.
¿Qué es la abstracción? (Concepto en sí mismo, sin metáforas)
La esencia de la abstracción es simple.
Unificar sistemas complejos en una única interfaz común (API).
Es decir, aunque los métodos de funcionamiento sean diversos, se los hace funcionar de una manera unificada.
La abstracción es una de las técnicas más poderosas en el mundo de la ingeniería.
¿Qué abstrajo ActiveRecord?
Hay una sola respuesta.
Unificó la sintaxis y el funcionamiento SQL únicos de cada base de datos en manipulaciones de objetos Ruby.
En otras palabras,
Cambió "diferentes mundos de bases de datos" a "un único mundo de código Ruby".
¿Qué tan poderoso es esto? Demostremos con un ejemplo.
Por ejemplo, digamos que queremos obtener una lista de usuarios.
Si usamos SQL directamente:
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;
Las sintaxis son diferentes.
LIMIT es diferente, las reglas de consulta son diferentes, las palabras clave son diferentes.
Pero, si usamos ActiveRecord?
Rails
User.order(created_at: :desc).limit(10)
Listo.
ActiveRecord, basado en este solo código Ruby,
convierte automáticamente a SQL específico de cada base de datos.
Si es MySQL, SQL personalizado de MySQL
Si es PostgreSQL, SQL personalizado de PostgreSQL
Si es SQLite, SQL personalizado de SQLite
Es decir, el desarrollador solo necesita saber Ruby.
El valor real que ofrece la abstracción
Los beneficios obtenidos por ActiveRecord a través de la abstracción son los siguientes.
1) Cambiar de base de datos es libre
Por ejemplo, cambiemos de SQLite a PostgreSQL.
Normalmente:
Modificar todas las SQL
Cambiar todos los tipos
Modificar todos los manejos de transacciones
Modificar todas las sintaxis de LIMIT/OFFSET
Pero en Rails...
No es necesario cambiar nada.
Solo cambia el adaptador en la configuración de Rails.
adaptador: postgresql
El código sigue igual:
User.where(active: true)
Y esto funciona correctamente.
2) Puedes desarrollar sin conocer la base de datos
ActiveRecord maneja automáticamente lo siguiente:
Almacenamiento de datos
Modificación
Consultas
Eliminación
Transacciones
Configuración de relaciones
Manejo de claves foráneas
Optimización de JOIN
El desarrollador solo necesita hacer esto.
usuario = User.find(5)
usuario.update(name: "Nuevo Nombre")
Pero en realidad, internamente en la base de datos,
se ejecutan SQL complejos automáticamente:
UPDATE users SET name = 'Nuevo Nombre' WHERE id = 5;
El desarrollador no necesita saber esto.
3) Permite un pensamiento centrado en el modelo (Model-driven Thinking)
SQL es un pensamiento centrado en los datos.
Pero Rails es un pensamiento centrado en los objetos.
Es decir, tratamos el modelo de usuario como un objeto real.
usuario.posts
Esta única línea maneja
JOIN, WHERE, INDEX, interpretación de relaciones...
todo.
Gracias a ActiveRecord,
el desarrollador puede concentrarse en diseñar la lógica del negocio.
En el momento en que entiendes la abstracción, ActiveRecord parece increíblemente genial
Mira el siguiente código Ruby.
usuarios = User.where("edad > ?", 18).order(:created_at)
Cuando se ejecuta este código, internamente:
Se examina la estructura del modelo
Se verifica el tipo de base de datos
Se escapan de manera segura las condiciones WHERE
Se aplica el orden
Se convierte en la sintaxis SQL que entiende la base de datos correspondiente
Se ejecuta el SQL
Los valores devueltos se convierten en objetos Ruby (User) en lugar de registros
Todo este proceso no necesita ser consciente para el desarrollador.
Es decir,
ActiveRecord = Una herramienta que convierte completamente el mundo de la base de datos en el mundo Ruby para el desarrollador
Gracias a esta abstracción,
los desarrolladores de Rails
pueden manejar todos los datos de un servicio completo
sin ser expertos en bases de datos,
solo con unas pocas líneas de Ruby.
Conclusión: ActiveRecord no es un ORM, es un 'motor de abstracción de base de datos'
¿Por qué ActiveRecord es un "tipo realmente genial"?
La razón es una sola.
ActiveRecord hace que los desarrolladores olviden por completo la complejidad y las reglas diferentes de cada base de datos.
Y permite manejar todos los tipos de bases de datos de la misma manera con un único lenguaje, Ruby.
Esta es la fuerza de la abstracción.
Esta es la filosofía de Rails.
Esta es la respuesta a por qué ActiveRecord es un ORM de nivel superior.