我知道它是ActiveRecord的替代品,它使用对象而不是查询。
但是...
为什么这样更好?
对象/查询会“更容易”创建吗?
会导致更高效的SQL查询吗?
它是否与所有主要数据库兼容? - 我想它会。
使用存储过程会更容易/更难吗?
答案 0 :(得分:182)
Rails 3.0中的Arel究竟是什么?
它是关系查询运算符的代数的对象模型。
我知道它是ActiveRecord的替代品
不,不是。它是字符串中手工制作SQL查询的替代品。它是基础 ActiveRecord的常见查询层,但它也可以用作DataMapper的基础,例如。
如果它是任何东西的替代品,它就是Ambition的替代品。或者,您可以将其视为LINQ标准查询运算符或Python的SQLAlchemy的Ruby版本。 (事实上,作者明确引用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? by Nick Kallen。注意:这篇文章包含一些温和的数学和计算机科学术语,但这正是重点:ARel在数学和计算机科学方面有一些坚实的基础,那些基础是赋予它强大性能的基础。
答案 1 :(得分:19)
我想说的是,ARel是ActiveRecord的显式查询模型,它为RDBMS生成和优化SQL查询。
另一方面,DataMapper是一个真正的数据映射器,并且已经可以与非关系数据存储进行交互。将来,DataMapper可能包含一个名为Veritas的独立库,旨在为来自任何数据存储的数据提供关系功能,而不仅仅是RDBMS。答案 2 :(得分:1)
Rails 3中的Arel生成关系对象,直到您需要它时才会查询db。效率更高。
它也更自然(一旦你习惯了它),这真的是Rails的强大力量。
答案 3 :(得分:0)
实际上我已经开始了关于ActiveRelation的视频系列。
查看第一个常规教程