跳到正文
网络寻租
返回

squeel介绍

squeel是Rails下面一个处理复杂sql查询的框架, 具体用法可以点击前面的链接查看,这里整理一下我对这个东西的评估。

为什么要用它?

平时我们在rails里面,需要写复杂查询的时候,一般都是直接写sql,比如:

Person.where(
  '(name LIKE ? AND salary < ?) OR (name LIKE ? AND salary > ?)',
  'Ernie%', 50000, 'Joe%', 100000
)

这样的写法不是很好,因为:

采用squeel,就可以变成这些的写法:

Person.where{(name =~ 'Ernie%') & (salary < 50000) | (name =~ 'Joe%') & (salary > 100000)}

原理

squeel使用的方法是传一个block给where,然后这个block会被修改作用域,在这个作用域里面, 各种操作符和变量都会被转义,变成Node对象,然后形成一个抽象语法树,最后通过底层的arel变成真正执行的sql。

具体代码比较重要的是dsl.rb里面的eval,method_missing,stub.rb,visitor.rb。

我思考了一下,这种方法应该是最简洁和干净的,语法是采用ruby的方式,魔法的部分都被包裹在block里面,和现有的功能无缝衔接。

使用心得

如果明白原理,使用它没有什么太多的问题,需要注意的是, 一定要看一遍log里面生成的sql,确认是自己期望的结构。

还有就是,squeel和原有系统切割得比较好,只有一点需要注意: 针对User.where(name: :aaa)里面把symbol当做value的状况,squeel会转变成:

select * from users where users.name == users.aaa

这是一个特性,如果你不期望这样的话,需要改成where(name: :aaa.to_s)。也可以关闭,具体看squeel的文档。

在我用的过程中,遇到几个问题:

结论

考虑一下是否需要采用squeel:它的学习成本应该只需要一个小时,性能问题可以通过cache来解决,可以无缝衔接,收益是更清晰,更一致,更好用的代码。


分享这篇文章:

上一篇
试用gitlab
下一篇
mosh介绍

评论

评论通过 GitHub 账号发布,需要先使用 GitHub 登录。