我知道它是ActiveRecord的替代品,它使用对象而不是查询。
但是..。
为什么这样更好?
创建对象/查询会“更容易”吗?
它会带来更高效的SQL查询吗?
它会兼容所有主要的数据库吗?-我想会的。
与存储过程一起使用会更容易还是更难?
发布于 2010-05-05 12:35:20
Rails 3.0中的Arel到底是什么?
它是一个关系查询操作符代数的对象模型。
我知道它是ActiveRecord的替代品
不,它不是。它是手工SQL查询字符串的替代品。例如,它是一个常见的查询层,是ActiveRecord的基础,但它也可以用作DataMapper的基础。
如果它是任何东西的替代品,那么它就是野心的替代品。或者,您可以将其视为LINQ标准查询操作符或Python的SQLAlchemy的Ruby版本。(事实上,作者明确地引用了LINQ和SQLAlchemy作为灵感。)
或者,您可以将其视为named_scope
的替代品。事实上,ARel在很大程度上实现了“每个查询都是一个named_scope
”的思想。而且,你知道吗:这两个都是同一个人写的。
,并且它使用对象而不是查询。
不,它使用对象作为查询。
为什么这样更好?
Ruby是面向对象的语言,而不是面向字符串的语言。仅出于这个原因,将查询表示为对象而不是字符串是有意义的。为查询构建适当的对象模型,而不是为所有内容使用字符串,这与为记帐系统构建适当的对象模型而不是使用字符串为所有内容提供的好处几乎相同。
另一个很大的优点是,ARel实现了实际的查询操作符代数。换句话说,ARel知道构造和组合查询的数学规则。如果连接两个字符串,每个字符串都包含一个有效的SQL查询,则结果可能不是有效的SQL查询。或者,更糟糕的是,它是一个有效的SQL查询,但它没有意义,或者它做的事情与您认为的完全不同。这种情况永远不会发生在ARel上。(这就是我在下面链接到的文章“在合成下关闭”的意思。)
创建对象/查询会变得“更容易”吗?
是。例如,正如我上面提到的,从更简单的部分构造更复杂的查询要容易得多。
它会带来更高效的
查询吗?
是。ARel具有适当的查询对象模型这一事实意味着,它可以在生成实际的查询之前很久就对这些查询执行优化。
它会兼容所有主要的数据库吗?-我想它会的。
是。事实上,我在上面一直在谈论SQL,但实际上关系查询代数可以生成几乎所有东西的查询。同样,以LINQ或Ambition为例:两者都可以查询SQL、LDAP、ActiveResource、CouchDB、Amazon、Google、…都使用相同的语法。
也许关于ARel是什么以及Nick Kallen为什么写的最好的讨论是 by Nick Kallen自己的文章,这篇文章的名字很贴切。注意:本文包含一些简单的数学和计算机科学术语,但这正是要点: ARel在数学和计算机科学方面有很强的基础,正是这些基础赋予了它强大的属性。
发布于 2010-05-06 16:26:20
不幸的是,它直接与生成ARel捆绑在一起,因此不适合DataMapper的需要。
我想说的是,ARel是一种显式的ActiveRecord查询模型,可以为RDBMSes生成和优化查询。
另一方面,DataMapper是一个真正的数据映射器,并且已经可以与非关系数据存储接口。在未来,DataMapper可能会包括一个名为Veritas的独立库,该库旨在为来自任何数据存储的数据提供关系功能,而不仅仅是RDBMSes。
发布于 2010-07-23 12:10:55
Rails 3中的Arel创建了关系对象,其中数据库直到您需要时才会被查询。效率更高。
它也更自然(一旦你习惯了),这就是Rails的强大之处。
https://stackoverflow.com/questions/2770415
复制相似问题