Rails arel 不好用啊?

linjunhalida · 2013年03月31日 · 最后由 lgn21st 回复于 2013年04月01日 · 3526 次阅读

rails 里面针对一些稍微复杂的查询,就需要手动来写查询条件,比如:

Product.where("subname = :id or id = :id", id: id).first

这种写法几个问题:

  • 限制在一种数据库里面
  • 不好针对 sql 做测试,只能通过单元测试来验证正确性
  • 易读性

然后我尝试用了一下 arel,结果变成了这种奇怪的东西:

t = Product.arel_table
Product.where(t[:subname].eq(id).or(t[:id].eq(id))).first

好吧,更不易读了。看来 sql 要比语法树更容易人工识别。。。

大家的看法是怎样的呢?

猜测是我的写法不对,应该是:

t = Product.arel_table
Product.where(t.subname == id || t.id == id)

然后可以用 arel 定义一套这样的 dsl。。。

233 确实很值得改进下 用运算符的方式来写啊

我觉得还可以接受吧,有时候业务还会复杂到无法使用 ActiveRecord 的时候,封装我觉得适度就好

通过 arel 封装一层 DSL 只要 50-60 行代码,而且异常的简单

#3 楼 @kenshin54 恩,思考了一下,是这样。但是 rails4 为什么要提供这个东西?让用户自己弄 dsl 吗?就没有一个最佳实践可以直接用?

用 AR 要小心,领域模型本来是为了避免业务脚本而发展出来的,但是有人会逐渐在 model 中使用 ruby 语言编写业务脚本,那就又回到了老路上

关于 Arel 请看这里,@kenshin54 大大亲自讲解,你一定不回后悔 http://ruby-china.org/topics/9886

需要 登录 后方可回复, 如果你还没有账号请 注册新账号