raw rails query create association active ruby-on-rails ruby activerecord arel

ruby on rails - query - ¿Qué es exactamente Arel in Rails 3.0?



ruby rails active record (4)

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

Pero...

¿Por qué es esto mejor?

¿los objetos / consultas serán "más fáciles" de crear?

¿conducirá a consultas SQL más eficientes?

¿Será compatible con todos los DB principales? - Supongo que lo hará.

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


¿Qué es exactamente Arel in Rails 3.0?

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

Entiendo que es un reemplazo para ActiveRecord

No, no lo es. Es un reemplazo para consultas SQL hechas a mano en cadenas. Es una capa de consulta común que subyace a ActiveRecord, pero también se puede usar como un apuntalamiento para DataMapper, por ejemplo.

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

O bien, puede verlo como un reemplazo para named_scope s. De hecho, ARel es más o menos la realización de la idea de que "cada consulta es un named_scope ". Y, ya sabes: ambos fueron escritos por el mismo tipo.

y que usa objetos en lugar de consultas.

No, usa objetos como consultas.

¿Por qué es esto mejor?

Ruby es un lenguaje orientado a objetos, no un lenguaje orientado a cuerdas. Por esa sola razón, tiene sentido representar las consultas como objetos en lugar de cadenas. Construir un modelo de objetos adecuado para las consultas en lugar de utilizar cadenas para todo le proporciona prácticamente los mismos beneficios que crear un modelo de objetos adecuado para un sistema de contabilidad en lugar de usar cadenas para todo lo que le ofrece.

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 componer consultas. Si concatena dos cadenas, cada una de las cuales contiene una consulta SQL válida, el resultado probablemente no será una consulta SQL válida. O, lo que es peor, es una consulta SQL válida, pero que no tiene sentido, o que hace algo totalmente diferente de lo que crees que hace. Esto nunca puede suceder con ARel. (Esto es a lo que el artículo que enlazo a continuación significa con "composición cerrada bajo").

¿los objetos / consultas serán "más fáciles" de crear?

Sí. 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?

Sí. 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 que alguna vez genere una consulta SQL real.

¿Será compatible con todos los DB principales? - Supongo que lo hará.

Sí. De hecho, siempre he hablado sobre el SQL anterior, pero en realidad un álgebra de consulta relacional 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.

Tal vez la mejor discusión sobre qué es ARel y por qué Nick Kallen escribió es el artículo acertadamente llamado ¿Por qué Arel? por el propio Nick Kallen . Nota: el artículo contiene alguna jerga matemática y matemática leve, pero ese es exactamente el punto: ARel tiene algunos fundamentos sólidos en matemáticas e informática, esas bases son las que le otorgan sus poderosas propiedades.


ARel, lamentablemente está directamente relacionado con la generación de SQL y, por lo tanto, no es adecuado para las necesidades de DataMapper.

La forma en que lo expresaría es que ARel es un modelo de consulta explícita para ActiveRecord que genera y optimiza las 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 tiene la intención de proporcionar funcionalidad relacional a los datos obtenidos de CUALQUIER almacén de datos, no solo RDBMS.


Arel in Rails 3 hace objetos de relación donde el DB no se consulta hasta que lo necesite. Mucho más eficiente.

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