ruby-on-rails - Rails 3.0 中的 Arel 究竟是什么?

标签 ruby-on-rails ruby activerecord arel

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

但是……

为什么这样更好?

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

它会带来更高效的 SQL 查询吗?

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

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

最佳答案

What exactly is Arel in Rails 3.0?

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

I understand that it is a replacement for ActiveRecord

不,不是。它替代了字符串中手工制作的 SQL 查询。它是 底层 ActiveRecord 的通用查询层,但也可以用作 DataMapper 等的基础。

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

或者,您可以将其视为 named_scope 的替代品。事实上,ARel 几乎就是“每个查询都是一个named_scope”这一理念的实现。而且,whaddayaknow:两者都是由同一个人编写的。

and that it uses objects instead of queries.

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

why is this better?

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

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

will objects/queries be "easier" to create?

是的。例如,正如我上面提到的,从更简单的部分构造更复杂的查询要容易得多。

will it lead to more efficient SQL queries?

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

will it be compatible with all major DBs? - I assume it will.

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

也许关于 ARel 是什么以及 Nick Kallen 为什么写的最好的讨论是恰当命名的文章 Why Arel? by Nick Kallen他自己。注意:这篇文章包含一些温和的数学和计算机科学术语,但这正是重点:ARel 在数学和计算机科学方面拥有坚实的基础,这些基础赋予了它强大的特性。

关于ruby-on-rails - Rails 3.0 中的 Arel 究竟是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770415/

相关文章:

ruby-on-rails - 如何使用私有(private)提交隐藏提要?

javascript - 如何获取不包含压缩代码的application.js?

ruby-on-rails - 1 周后 8 点钟

ruby-on-rails - Activerecord:通过单个查询查找非关联加关联的记录

ruby - Integer === 3 如何工作?

ruby-on-rails - 你能在 Rails 中获取数据库用户名、密码、数据库名称吗?

ruby-on-rails - 每个 Ruby 未定义的方法

ruby-on-rails - rails 2.3 : How to turn this SQL statement into a named_scope

mysql - 如何延迟加载或急切加载关联表的总和?

ruby-on-rails - 验证 rails 中是否存在多个属性之一