一、什么是arel
arel是一个ruby实现的关系代数,用于简化复杂查询,适应多种关系数据库,目前已集成到active-record中。
二、具体用法
1 怎么运行
Order.where("id >= ?",2)
Order.where(Order.arel_table['id'].gteq(2))
生成sql:SELECT `orders`.* FROM `orders` WHERE `orders`.`id` = 2
简单示例:
def blank_or_speical(field_name,field_val)
field_litera = Arel::Nodes::SqlLiteral.new(field_name)
if field_val.is_a?(Array)
right_part = Arel::Nodes::In.new(field_litera,field_val.map{|val| Arel::Nodes.build_quoted(val)})
else
right_part = Arel::Nodes::Equality.new(field_litera,Arel::Nodes.build_quoted(field_val))
end
Arel::Nodes::Or.new(
Arel::Nodes::Equality.new(
field_litera,nil
),
right_part
)
end
Order.where(blank_or_speical('id',[1,2,3])) #等效
Order.where(id:[nil,1,2,3])
SELECT "orders".* FROM "orders" WHERE EXTRACT(HOUR FROM "orders"."created_at") = 20
function 示例:
def hour_eq(field_name,field_value)
Arel::Nodes::Extract.new(
Arel::Nodes::SqlLiteral.new(field_name),:hour).eq(field_value)
end
Order.where(hour_eq('created_at',20))
Arel::Nodes::NamedFunction.new('cast',
[
Arel::Nodes::As.new(
Arel::Nodes::SqlLiteral.new('created_at'),
Arel::Nodes::SqlLiteral.new('date')
)
]
).to_sql # "cast(created_at AS date)"
常用的方法
Arel::Nodes::SqlLiteral #sql 字面量
Arel::Nodes.build_quoted #变量
Arel::Nodes::Equality #相等
Arel::Nodes::GreaterThan #大于
Arel::Nodes::GreaterThanOrEqual #大于等于
Arel::Nodes::LessThan #小于
Arel::Nodes::LessThanOrEqual#小于等于
Arel::Nodes::In # in relation
Arel::Nodes::As # 用于 as
Arel::Nodes::NamedFunction # 调用方法