Rails 3.0中的Arel到底是什么?


86

我知道这是ActiveRecord的替代品,并且它使用对象而不是查询。

但...

为什么这更好?

对象/查询将更容易创建吗?

会导致更有效的SQL查询吗?

与所有主要数据库兼容吗?-我想会的。

使用存储过程会更容易/更难吗?

Answers:


182

Rails 3.0中的Arel到底是什么?

它是关系查询运算符代数的对象模型。

我了解这是ActiveRecord的替代品

不,不是。它替代了手工处理字符串中的SQL查询。它是ActiveRecord基础的常见查询层,但是例如,它也可以用作DataMapper的基础。

如果可以替代任何东西,那么它可以替代野心。或者,您可以将其视为LINQ标准查询运算符的Ruby版本或Python的SQLAlchemy。(实际上,作者明确引用了LINQ和SQLAlchemy作为灵感。)

或者,您可以将其替换为named_scope。实际上,ARel几乎实现了“每个查询都是一个named_scope”的想法。而且,whaddayaknow:两者都是同一个人写的。

并且它使用对象而不是查询。

不,它使用对象作为查询。

为什么这更好?

Ruby是一种面向对象的语言,而不是一种面向字符串的语言。出于这个原因,独自,是有意义的代表查询作为对象,而不是字符串。为查询建立适当的对象模型而不是为所有内容使用字符串,将为您带来与为会计系统建立适当的对象模型而不是为所有内容使用字符串提供的收益几乎相同的好处。

另一个大优点是,ARel实现了查询运算符的实际代数。换句话说,ARel知道有关构造和组成查询的数学规则。如果连接两个字符串,每个字符串包含一个有效的SQL查询,则结果可能不会是有效的SQL查询。或者,更糟糕的是,这一个有效的SQL查询,但没有意义,或者所做的事情与您认为的完全不同。对于ARel,这永远不会发生。(这是我在下面链接到的文章的意思是“封闭构成”。)

对象/查询将更容易创建吗?

是。例如,如上所述,从更简单的部分构造更复杂的查询要容易得多。

会导致更有效的SQL查询吗?

是。ARel具有适合查询的对象模型这一事实意味着,它可以在生成实际SQL查询之前很久就可以对那些查询执行优化。

与所有主要数据库兼容吗?-我想会的。

是。实际上,我在上面一直都在谈论SQL,但是实际上,关系查询代数可以生成几乎所有查询。再次以LINQ或Ambition为例:两者都可以使用相同的语法查询SQL,LDAP,ActiveResource,CouchDB,Amazon,Google等。

关于Arel是什么以及Nick Kallen为什么写的最好的讨论可能是恰当命名的文章Why Arel?由尼克·卡伦本人撰写。注意:本文包含一些温和的数学和计算机科学术语,但这恰恰是要点:ARel在数学和计算机科学方面拥有一些强大的基础,这些基础为其赋予了强大的性能。


出色的答案。我已经阅读了您发布的链接,并在很大程度上关注了该链接。实际上,comp sci部分是有意义的,但是如何将其合并到rails中正是我遇到的问题。对我来说,它取代了手工制作的SQL(或其他任何东西),因此对我来说更有意义,因此AR是在3.0之上建立的。对于那些应该更了解的人来说,我的印象已经不同了。这个答案对上述每个问题的简单,准确的解释非常出色。
威尔

我确实有一个后续问题。您在上面提到了LDAP,AMZ等。我假设当前(基于github上的rails / arel)ARel不具备该功能,只是潜力而已?即直到有人实现这一部分。听起来确实很令人兴奋。
威尔

2
@Will-我认为您将不得不等待有人开发这些更时髦的功能。还是自己弄一个裂缝,您是否需要?
Mike Woodhouse,2010年

1
+1,尽管链接已死;天真的搜索未找到当前链接。
Dave Newton

@DaveNewton:显然,它不见了。有一些缓存副本左右浮动,如bmark.us/bmark/readable/913ff84fc0dcdc
约尔格W¯¯米塔格

19

不幸的是,ARel直接与生成SQL绑定,因此不适合DataMapper的需求。

我要说的是,ARel是ActiveRecord的显式查询模型,可为RDBMSes生成并优化SQL查询。

另一方面,DataMapper是真正的数据映射器,并且可以与非关系数据存储接口。将来,DataMapper可能会包含一个单独的库,称为Veritas,该库旨在为从ANY数据存储中获取的数据提供关联功能,而不仅仅是RDBMSes。


2
为什么会收到-1?
杰里科

10
我是DataMapper的维护者,知识理论是对的。在当前的实现中,ARel不能在DataMapper下使用,因为它仅提供与DM支持的40多个数据存储一起使用所需功能的子集。恕我直言,当前的实现与SQL生成紧密相关,要修复API /内部组件以使用与RDBMS完全不同的数据存储,将需要进行大量工作。ARel是向前迈出的一步,但目前尚不能为ActiveRecord奠定基础。
dkubb

1

在Rails 3中,Arel生成了关系对象,直到您需要它时才查询数据库。效率更高。

它也更自然(一旦您习惯了),这确实是Rails的强大优势。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.