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