我知道这是ActiveRecord的替代品,并且它使用对象而不是查询。
但...
为什么这更好?
对象/查询将更容易创建吗?
会导致更有效的SQL查询吗?
与所有主要数据库兼容吗?-我想会的。
使用存储过程会更容易/更难吗?
Answers:
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在数学和计算机科学方面拥有一些强大的基础,这些基础为其赋予了强大的性能。
不幸的是,ARel直接与生成SQL绑定,因此不适合DataMapper的需求。
我要说的是,ARel是ActiveRecord的显式查询模型,可为RDBMSes生成并优化SQL查询。
另一方面,DataMapper是真正的数据映射器,并且可以与非关系数据存储接口。将来,DataMapper可能会包含一个单独的库,称为Veritas,该库旨在为从ANY数据存储中获取的数据提供关联功能,而不仅仅是RDBMSes。
实际上,我已经开始了有关ActiveRelation的视频系列。
可以在http://Innovative-Studios.com/#pilot上查看第一个一般教程。