O que exatamente é Arel em Rails 3.0?
É um modelo de objeto para uma álgebra de operadores de consulta relacionais.
Eu entendo que é um substituto para ActiveRecord
Não, não é. É um substituto para consultas SQL feitas à mão em strings. É uma camada de consulta comum que sustenta ActiveRecord, mas também pode ser usada como base para DataMapper, por exemplo.
Se for um substituto para qualquer coisa, é um substituto para a Ambição. Ou você pode pensar nisso como uma versão Ruby dos operadores de consulta padrão LINQ ou SQLAlchemy do Python. (Na verdade, o autor cita explicitamente LINQ e SQLAlchemy como inspirações.)
Ou você pode vê-lo como um substituto para named_scope
s. Na verdade, ARel é basicamente a realização da ideia de que "toda consulta é uma named_scope
". E, whaddayaknow: ambos foram escritos pelo mesmo cara.
e que usa objetos em vez de consultas.
Não, ele usa objetos como consultas.
porque isso é melhor?
Ruby é uma linguagem orientada a objetos, não uma linguagem orientada a strings. Por essa razão sozinho , não faz sentido para representar consultas como objetos em vez de strings. Construir um modelo de objeto adequado para consultas em vez de usar strings para tudo oferece praticamente os mesmos benefícios que construir um modelo de objeto apropriado para um sistema de contabilidade em vez de usar strings para tudo oferece.
Outra grande vantagem é que o ARel implementa uma álgebra real de operadores de consulta. Em outras palavras, ARel conhece as regras matemáticas para construir e compor consultas. Se você concatenar duas strings, cada uma contendo uma consulta SQL válida, o resultado provavelmente não será uma consulta SQL válida. Ou, pior ainda, é uma consulta SQL válida, mas que não faz sentido ou que faz algo totalmente diferente do que você pensa que faz. Isso pode nunca acontecer com ARel. (Isso é o que o artigo que vinculo abaixo significa com "fechado sob composição".)
os objetos / consultas serão "mais fáceis" de criar?
Sim. Por exemplo, como mencionei acima, é muito mais fácil construir consultas mais complexas a partir de partes mais simples.
isso levará a consultas SQL mais eficientes?
Sim. O fato de ARel ter um modelo de objeto adequado para as consultas significa que ele pode realizar otimizações nessas consultas muito antes de gerar uma consulta SQL real.
será compatível com todos os principais bancos de dados? - Eu suponho que sim.
Sim. Na verdade, eu sempre falei sobre SQL acima, mas na verdade uma álgebra de consulta relacional pode gerar consultas para quase tudo. Novamente, veja LINQ ou Ambition como exemplos: ambos podem consultar SQL, LDAP, ActiveResource, CouchDB, Amazon, Google, ... todos com a mesma sintaxe.
Talvez a melhor discussão sobre o que é ARel e por que Nick Kallen escreveu seja o artigo apropriadamente nomeado Por Arel? pelo próprio Nick Kallen . Nota: o artigo contém um pouco de jargão matemático e de ciência da computação, mas esse é exatamente o ponto: ARel tem alguns fundamentos fortes em matemática e ciência da computação, esses fundamentos são o que lhe dão suas propriedades poderosas.
ARel, infelizmente, está diretamente vinculado à geração de SQL e, portanto, é inadequado para as necessidades do DataMapper.
A maneira como eu colocaria é que ARel é um modelo de consulta explícito para ActiveRecord que gera e otimiza consultas SQL para RDBMSes.
O DataMapper, por outro lado, é um mapeador genuíno para dados e já pode fazer interface com armazenamentos de dados não relacionais. No futuro, o DataMapper provavelmente incluirá uma biblioteca separada chamada Veritas, que se destina a fornecer funcionalidade relacional para dados originados de QUALQUER armazenamento de dados, não apenas RDBMSes.
fonte
Arel no Rails 3 cria objetos de relação onde o banco de dados não é consultado até que você precise dele. Muito mais eficiente.
Também é mais natural (depois que você se acostuma) que é realmente a grande força do Rails.
fonte
Na verdade, comecei uma série de vídeos sobre ActiveRelation.
O primeiro tutorial geral pode ser visto em http://Innovative-Studios.com/#pilot
fonte