王梦琪的博客

记录技术学习及感悟

使用Arel进行SQL查询

| Comments

Arel简介

Arel is a SQL AST manager for Ruby. 源自Arel的github主页

Arel是一个SQL AST管理器,AST全称Abstract Syntax Tree(抽象语法树)。Arel原本是一个Ruby Gem,后来被吸收进Ruby框架,成为Rails源代码的一部分,可用用来编写复杂SQL查询。

先定义,就可以使用了

def table
 User.arel_table
end

users.where(users[:name].eq('amy'))
# SELECT * FROM users WHERE users.name = 'amy'

Arel可以方便定义各种运算符 =, !=, <, >, <=, >=, IN:

users.where(users[:age].eq(10)).project(Arel.sql('*'))
#  => SELECT * FROM "users"  WHERE "users"."age" = 10


users.where(users[:age].not_eq(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" != 10


users.where(users[:age].lt(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" < 10


users.where(users[:age].gt(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" > 10


users.where(users[:age].lteq(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" <= 10


users.where(users[:age].gteq(10)).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" >= 10


users.where(users[:age].in([20, 16, 17])).project(Arel.sql('*'))
# => SELECT * FROM "users"  WHERE "users"."age" IN (20, 16, 17)

联表查询也很方便

users.join(photos).on(users[:id].eq(photos[:user_id]))
# => SELECT * FROM users INNER JOIN photos ON users.id = photos.user_id

Arel一个重要特性是“composability”,可组合

users.where(users[:name].eq('bob')).where(users[:age].lt(25))


users.where(users[:name].eq('bob').or(users[:age].lt(25)))

Comments

comments powered by Disqus