86

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

但...

为什么这更好?

对象/查询会“更容易”创建吗?

它会导致更高效的 SQL 查询吗?

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

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

4

4 回答 4

182

Rails 3.0 中的 Arel 到底是什么?

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

我了解它是 ActiveRecord 的替代品

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

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

或者,您可以将其视为 s 的替代品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 在数学和计算机科学方面有一些坚实的基础,这些基础赋予了它强大的特性。

于 2010-05-05T04:35:20.483 回答
19

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

我想说的是,ARel 是 ActiveRecord 的显式查询模型,它为 RDBMS 生成和优化 SQL 查询。

另一方面,DataMapper 是真正的数据映射器,并且已经可以与非关系数据存储进行交互。未来 DataMapper 可能会包含一个名为 Veritas 的单独库,旨在为来自任何数据存储的数据提供关系功能,而不仅仅是 RDBMS。

于 2010-05-06T08:26:20.427 回答
1

Rails 3 中的 Arel 生成关系对象,在您需要之前不会查询数据库。效率更高。

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

于 2010-07-23T04:10:55.093 回答
0

实际上我已经开始了一个关于 ActiveRelation 的视频系列。

第一个通用教程可以在http://Innovative-Studios.com/#pilot查看

于 2010-05-08T17:07:11.237 回答