阿雷尔和红宝石在铁轨上
#sql #database #ruby #rails

嗨,伙计们!希望大家一切都好并庆祝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的查询,有一个很好的规则可以在使用ANDOR的任何地方打破一种方法。

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))

我们还可以使用其他方法来确定不同的查询:
sumaveragecountminmax一样,我们可以用来对值进行不同的操作

table.project(table[:rate].average)

结论

在本文中,我们稍作讨论了Arel的基础知识,例如IT及其历史及其基本语法,但是它有更多的内容可能非常有帮助,并且还有很多要了解的内容,因此,因此,我建议您通过Arel documentation进行肮脏并开始使用它。
如果您有任何评论或任何反馈,我很高兴从您的身边听到。

farha zane