O que exatamente é Arel em Rails 3.0?

86

Eu entendo que é um substituto para ActiveRecord e que usa objetos em vez de consultas.

Mas...

porque isso é melhor?

os objetos / consultas serão "mais fáceis" de criar?

isso levará a consultas SQL mais eficientes?

será compatível com todos os principais bancos de dados? - Eu suponho que sim.

será mais fácil / mais difícil de usar com procedimentos armazenados?

Vai
fonte

Respostas:

182

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_scopes. 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.

Jörg W Mittag
fonte
Excelente resposta. Eu li o link que você postou e o segui na maior parte do tempo. Na verdade, a parte de comp sci fazia sentido, mas como ela foi incorporada aos trilhos era onde eu estava tendo problemas. Faz muito mais sentido para mim que ele substitua o SQL feito à mão (ou qualquer outro) e, portanto, que o AR seja construído em cima dele no 3.0. Tenho recebido diferentes impressões de pessoas que deveriam saber mais e essa resposta é brilhante em sua explicação simples e precisa de cada questão acima.
Será
Eu tenho uma pergunta complementar. Você mencionou LDAP, AMZ, etc. acima, presumo que atualmente (com base em rails / arel no github) ARel não tem essa capacidade, apenas o potencial? ou seja, até que alguém implemente essa parte. Isso soa muito excitante.
Será
2
@Will - Acho que você vai ter que esperar que alguém desenvolva essas habilidades mais funk. Ou tente um você mesmo, caso precise?
Mike Woodhouse
1
+1, embora o link esteja morto; a pesquisa ingênua não encontrou o link atual.
Dave Newton
@DaveNewton: Aparentemente, acabou. Existem algumas cópias em cache flutuando, por exemplo, bmark.us/bmark/readable/913ff84fc0dcdc
Jörg W Mittag
19

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.

saber a teoria
fonte
2
Por que isso recebeu -1?
Jeriko
10
Eu sou o mantenedor do DataMapper, e o que a teoria do conhecimento diz é verdade. ARel, em sua implementação atual, não pode ser usado sob o DataMapper porque ele fornece apenas um subconjunto da funcionalidade necessária para trabalhar com os mais de 40 datastores que DM suporta. IMHO, a implementação atual está fortemente acoplada à geração de SQL, e vai dar muito trabalho para consertar a API / internos para trabalhar com datastores substancialmente diferentes de um RDBMS. ARel é um passo em frente, mas não pode formar uma base para mais do que ActiveRecord no momento.
dkubb
1

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.

BServiss
fonte
0

Na verdade, comecei uma série de vídeos sobre ActiveRelation.

O primeiro tutorial geral pode ser visto em http://Innovative-Studios.com/#pilot

Snuggs
fonte
Eu gostei do vídeo também. Era meio básico, mas reuni algumas informações novas extras. Gostaria de ver os vídeos subsequentes!
Purplejacket