¿Qué es exactamente Arel en Rails 3.0?


86

Entiendo que es un reemplazo de ActiveRecord y que usa objetos en lugar de consultas.

Pero...

porque es esto mejor

¿Será "más fácil" crear objetos / consultas?

¿conducirá a consultas SQL más eficientes?

¿Será compatible con las principales bases de datos? - Asumo que lo hará.

¿Será más fácil / difícil de usar con procedimientos almacenados?

Respuestas:


182

¿Qué es exactamente Arel en Rails 3.0?

Es un modelo de objetos para un álgebra de operadores de consultas relacionales.

Entiendo que es un reemplazo de ActiveRecord

No, no lo es. Es un reemplazo para la elaboración manual de consultas SQL en cadenas. Es una capa de consulta común que subyace a ActiveRecord, pero también se puede utilizar como base para DataMapper, por ejemplo.

Si es un reemplazo de algo, es un reemplazo de Ambition. O puede pensar en ello como una versión Ruby de los operadores de consulta estándar LINQ o SQLAlchemy de Python. (De hecho, el autor cita explícitamente tanto LINQ como SQLAlchemy como inspiraciones).

O puede verlo como un reemplazo para named_scopes. De hecho, ARel es prácticamente la realización de la idea de que "cada consulta es un named_scope". Y, qué sepas: ambos fueron escritos por el mismo tipo.

y que utiliza objetos en lugar de consultas.

No, utiliza objetos como consultas.

porque es esto mejor

Ruby es un lenguaje orientado a objetos, no un lenguaje orientado a cadenas. Solo por esa razón , tiene sentido representar las consultas como objetos en lugar de cadenas. La creación de un modelo de objetos adecuado para las consultas en lugar de utilizar cadenas para todo le ofrece prácticamente los mismos beneficios que la creación de un modelo de objetos adecuado para un sistema de contabilidad en lugar de utilizar cadenas para todo.

Otra gran ventaja es que ARel implementa un álgebra real de operadores de consulta. En otras palabras, ARel conoce las reglas matemáticas para construir y redactar consultas. Si concatenas dos cadenas, cada una de las cuales contiene una consulta SQL válida, es probable que el resultado no sea una consulta SQL válida. O, peor aún, es una consulta SQL válida, pero una que no tiene sentido, o que hace algo totalmente diferente de lo que crees que hace. Esto nunca puede suceder con ARel. (Esto es lo que significa el artículo que enlazo a continuación con "composición cerrada").

¿Será "más fácil" crear objetos / consultas?

Si. Por ejemplo, como mencioné anteriormente, es mucho más fácil construir consultas más complejas a partir de partes más simples.

¿conducirá a consultas SQL más eficientes?

Si. El hecho de que ARel tenga un modelo de objetos adecuado para las consultas significa que puede realizar optimizaciones en esas consultas mucho antes de generar una consulta SQL real.

¿Será compatible con las principales bases de datos? - Asumo que lo hará.

Si. De hecho, siempre hablé de SQL arriba, pero en realidad un álgebra de consultas relacionales puede generar consultas para casi todo. Nuevamente, vea LINQ o Ambition como ejemplos: ambos pueden consultar SQL, LDAP, ActiveResource, CouchDB, Amazon, Google,… todos con la misma sintaxis.

Quizás la mejor discusión sobre qué es ARel y por qué escribió Nick Kallen es el artículo acertadamente llamado ¿Por qué Arel? por el propio Nick Kallen . Nota: el artículo contiene un poco de jerga matemática e informática, pero ese es exactamente el punto: ARel tiene unas bases sólidas en matemáticas e informática, esas bases son las que le dan sus poderosas propiedades.


Excelente respuesta. Había leído el enlace que publicaste y lo seguí en su mayor parte. De hecho, la parte de ciencia ficción tenía sentido, pero la forma en que se incorporó a los rieles fue donde estaba teniendo los problemas. Para mí tiene mucho más sentido que reemplace el SQL hecho a mano (o lo que sea) y, por lo tanto, AR se construye sobre él en 3.0. Había estado obteniendo diferentes impresiones para las personas que deberían saberlo mejor y esta respuesta es brillante en su explicación simple y precisa de cada pregunta anterior.
Será

Tengo una pregunta de seguimiento. Mencionaste LDAP, AMZ, etc. anteriormente, supongo que actualmente (basado en rails / arel en github) ARel no tiene esa capacidad, ¿solo el potencial? es decir, hasta que alguien implemente esa parte. Sin embargo, esto suena muy emocionante.
Será

2
@Will: creo que tendrás que esperar a que alguien desarrolle esas capacidades más divertidas. O prueba uno tú mismo, ¿lo necesitas?
Mike Woodhouse

1
+1, aunque el enlace está muerto; la búsqueda ingenua no encontró el enlace actual.
Dave Newton

@DaveNewton: Aparentemente, se ha ido. Hay algunas copias en caché flotando, por ejemplo, bmark.us/bmark/readable/913ff84fc0dcdc
Jörg W Mittag

19

ARel, desafortunadamente, está directamente vinculado a la generación de SQL y, por lo tanto, no es adecuado para las necesidades de DataMapper.

La forma en que lo diría es que ARel es un modelo de consulta explícito para ActiveRecord que genera y optimiza consultas SQL para RDBMS.

DataMapper, por otro lado, es un mapeador genuino de datos y ya puede interactuar con almacenes de datos no relacionales. En el futuro, es probable que DataMapper incluya una biblioteca separada llamada Veritas, que está destinada a proporcionar funcionalidad relacional a los datos provenientes de CUALQUIER almacén de datos, no solo de RDBMS.


2
¿Por qué recibió -1?
Jeriko

10
Soy el mantenedor de DataMapper, y lo que dice la teoría del conocimiento es cierto. ARel, en su implementación actual, no se puede usar debajo de DataMapper porque solo proporciona un subconjunto de la funcionalidad necesaria para trabajar con los más de 40 almacenes de datos que admite DM. En mi humilde opinión, la implementación actual está estrechamente acoplada a la generación de SQL, y se necesitará mucho trabajo para arreglar la API / internos para que funcionen con almacenes de datos sustancialmente diferentes de un RDBMS. ARel es un paso adelante, pero no puede formar una base para más que ActiveRecord en este momento.
dkubb

1

Arel en Rails 3 crea objetos de relación donde la base de datos no se consulta hasta que la necesita. Mucho más eficiente.

También es más natural (una vez que te acostumbras), que es realmente la gran fortaleza de Rails.


0

De hecho, he comenzado una serie de videos sobre ActiveRelation.

El primer tutorial general se puede ver en http://Innovative-Studios.com/#pilot


También me gustó el video. Era algo básico, pero obtuve algunos bits de información nueva adicional. ¡Me gustaría ver videos posteriores!
Purplejacket
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.