Arel在Rails 3.0中究竟是什么?
我知道它是ActiveRecord的替代品,它使用对象而不是查询。
但…
为什么这更好?
将对象/查询“更容易”创build?
会导致更有效的SQL查询?
它将与所有主要数据库兼容吗? – 我认为会的。
使用存储过程会更容易吗?
Arel在Rails 3.0中究竟是什么?
这是一个关系查询运算符代数的对象模型。
我知道这是ActiveRecord的替代品
不,不是的。 这是在string中手工制作SQL查询的替代品。 例如,这是一个常见的查询层,它是 ActiveRecord的基础 ,但它也可以用作DataMapper的基础。
如果它是任何东西的替代品,它是Ambition的替代品。 或者,您可以将其视为LINQ标准查询运算符或Python的SQLAlchemy的Ruby版本。 (实际上,作者明确引用了LINQ和SQLAlchemy作为灵感。)
或者,您可以将其视为named_scope
的替代品。 实际上,ARel实际上是“每个查询都是一个named_scope
”的概念的实现。 而且,今天知道:两者都是由同一个人写的。
而且它使用对象而不是查询。
不,它使用对象作为查询。
为什么这更好?
Ruby是一种面向对象的语言,而不是一种面向string的语言。 仅仅因为这个原因,将查询表示为对象而不是string是有意义的。 为查询build立一个适当的对象模型而不是使用string的方式为您提供了几乎相同的好处,即为会计系统build立一个适当的对象模型,而不是使用一切为您提供的string。
另一大优势是ARel实现了一个查询操作符的实际代数 。 换句话说,ARel知道构造和编写查询的math规则。 如果连接两个string,其中每个string都包含有效的SQL查询,则结果可能不会是有效的SQL查询。 或者,更糟糕的是,这是一个有效的SQL查询,但是这个查询是没有意义的,或者做了与您所想的完全不同的事情。 ARel 永远不会发生这种情况。 (这是我链接到下面的文章意味着“闭合下组成”)。
将对象/查询“更容易”创build?
是。 例如,正如我上面提到的,从较简单的部分构build更复杂的查询要容易得多。
会导致更有效的SQL查询?
是。 ARel具有合适的查询对象模型的事实意味着它可以在这些查询生成实际的SQL查询之前就对其执行优化。
它将与所有主要数据库兼容吗? – 我认为会的。
是。 实际上,我总是提到上面的SQL,但实际上关系查询代数可以为几乎所有事情生成查询。 同样,以LINQ或Ambition为例:两者都可以使用相同的语法查询SQL,LDAP,ActiveResource,CouchDB,Amazon,Google …等等。
也许关于ARel是什么以及为什么Nick Kallen写的最好的讨论是恰当命名的文章Why Arel? 尼克·卡伦本人。 注意:这篇文章包含一些温和的math和计算机科学术语,但这正是重点:ARel在math和计算机科学方面有一些强大的基础,这些基础是它的强大属性。
不幸的是,ARel与生成SQL直接相关,因此不适合DataMapper的需求。
我想说的是,ARel是ActiveRecord的显式查询模型,它为RDBMS生成和优化SQL查询。
另一方面,DataMapper是一个真正的数据映射器,并且可以与非关系数据存储接口。 将来,DataMapper可能会包含一个名为Veritas的独立库,旨在为来自任何数据存储的数据提供关系function,而不仅仅是RDBMS。
Arel在Rails 3中创build关系对象,直到你需要的时候才会查询db。 效率更高
这也更自然(一旦你习惯了),这真是Rails的强项。
其实我已经开始了一个关于ActiveRelation的video系列。
第一篇综合教程可以在http://Innovative-Studios.com/#pilot查看;