嗨,伙计们!希望大家一切都好并庆祝Ruby的生日!
今天在这篇文章中,我们将谈论 arel ,这是我们要讨论的清单:
- 什么是Arel?
- Arel的历史
- 使用Arel的优势
- Arel Basic语法
- 结论
什么是阿雷尔?
Arel是一个图书馆,用于帮助我们以更轻松的,更可读和 Cleanter 方式来帮助我们编写SQL查询。 。另外,它有助于我们编写简单和复杂的查询。
阿雷尔的历史
arel是在Rails 3中引入的,但现在已捆绑到Active Record Gem中,并保留在rails/rails存储库中。
使用Arel的优点
-
可读性
由于所有SQL查询都是字符串,因此可能很难读取,编辑或分解复杂的查询。
-
可重复使用
,重复使用Arel查询要容易得多,因为它们是由相互联系的节点组成的 - 比字符串插值更安全的选择。
-
可靠性
如果我们加入另一个表,由于ID列的歧义,我们的查询将立即断开。即使我们使用表名称限定了列,如果Rails决定别名,这也会破裂。
Arel Basic语法
- Arel表
to开始创建查询,我们需要确定要查询的模型。然后,我们需要与该模型的Arel表进行交互,这可以通过使用arel_table
方法
来完成
users = User.arel_table
这里有一个为该表创建的Arel::Table
对象。在为该数据表创建该对象之后,AREL将该表的每一列转换为Arel::Node
,我们可以执行该库在其上支持的不同方法。 Arel中最常见的方法是:
- 等于 (eq)
- 不等于 (not_eq)
- 大于 (gt)
- 小于 (lt)
- 大于或等于 (gteq)
- 小于或等于 (LTEQ)
- 或 (OR)
- 和 (和)
注意:查看所有可以运行的Arel谓词:
Arel::Predications.instance_methods
- 查询
我们可以说,使用where
方法构建的所有查询中有75%以上,因为它用于过滤我们的数据并根据特定的真实条件选择特定零件。由于where
方法可以采用不同种类的参数,因此我们可以将自定义的Arel查询传递给它,这可能是如此强大。
注意:要打破使用Arel的查询,有一个很好的规则可以在使用
AND
或OR
的任何地方打破一种方法。
class UserMembershipQuery
def members
users = User.where(public_profile.and(group_member))
end
private
def table
User.arel_table
end
def public_profile
table[:private].eq(false)
end
def group_member
table[:group_member].eq(true)
end
end
users[:id].in([1,2,3]).to_sql
=> "`users`.`id` IN (1, 2, 3)"
users[:id].gt(2).to_sql
=> "`users`.`id` > 2"
users[:id].eq(3).to_sql
=> "`users`.`id` = 3"
User.where(table[:id].in([1,2,3])).to_sql
# SELECT "users".* FROM "users" WHERE "users"."id" IN (1, 2, 3)
- 投影查询
投影查询与select
查询相同,我们使用project
指定要选择或返回的节点。这将需要直接作为SQL执行,并且不能轻易与ActivereCord查询结合。
User.where(table[:role].eq(:admin)).project(:email).to_sql
=> "SELECT email FROM `users` WHERE `users`.`role` = 2"
并将这些查询与活动记录联系起来更为复杂:
ActiveRecord::Base.connection.exec_query User.where(users[:role].eq(:admin)).project(:email)
- 加入
在这里我们可以看到Arel真的很有用,因为使用Arel编写JOIN查询比SQL更简单和可读。
subscriptions = Subscription.arel_table
table.join(subscriptions)
是!这很简单!我们还可以确定关系
table.join(subscriptions, Arel::Nodes::OuterJoin).on(table[:id].eq(subscriptions[:user_id]))
并用条件写入加入
table.joins(:subscriptions).merge(Subscription.where(active: true))
我们还可以使用其他方法来确定不同的查询:
像sum
,average
,count
,min
和max
一样,我们可以用来对值进行不同的操作
table.project(table[:rate].average)
结论
在本文中,我们稍作讨论了Arel的基础知识,例如IT及其历史及其基本语法,但是它有更多的内容可能非常有帮助,并且还有很多要了解的内容,因此,因此,我建议您通过Arel documentation进行肮脏并开始使用它。
如果您有任何评论或任何反馈,我很高兴从您的身边听到。
由 farha zane