开源项目 [分享] 更方便在 Rails 内写 OR 语句的 gem

khiav223577 · 2017年01月16日 · 最后由 ericguo 回复于 2017年01月19日 · 2225 次阅读

新人发帖,请多指教~~
rails_or 是我写的一个小工具,希望让大家在写 Rails 时能够更开心点。

大家可能知道,Rails 5 终于在 Active Record 内加上了 or 函式,
让你可以写以下的语句:

Person.where(name: 'Pearl').or(Person.where(age: 24))

但是每次 or 语句内都得重复写上Model.where(XXX),很繁琐。
假如你又要 join 其它 table 的资料时,又更繁琐了:

User.joins(:posts).where(id: 2)
                  .or(User.joins(:posts).where('posts.title = ?', "title"))
                  .or(User.joins(:posts).where('posts.created_at > ?', 1.day.ago))

rails_or 支援了更方便的语法,
同时也支援了 Rails 3, 4, 5,不必担心版本升级的问题,
也不必苦苦等待升到 Rails 5 的那天才能写 or 语句。

语法如下所示:

Person.where(name: 'Pearl').or(age: 24)
User.joins(:posts).where(id: 2)
                  .or('posts.title': "title")
                  .or('posts.created_at > ?', 1.day.ago)

代码都在 https://github.com/khiav223577/rails_or 上,
欢迎大家使用或提交 pull request,
喜欢的也可以顺便帮忙给颗星、推广一下呗。

你这个 or 考虑的有点简单。除了你自己没人敢用。

简单不就是一件好事么?
其实就是个语法糖,举例来说:
Rails 5:

xxx = Model.join(yyy)
result = xxx.where(zzz).or(xxx.where(aaa)).or(xxx.where(bbb))

rails_or:

xxx = Model.join(yyy)
result = xxx.where(zzz).or(aaa).or(bbb)

其实还是直接写 sql 好用

看起来挺赞的!👍,代码好看多了

SQL 里的 where 条件,通常这么写

select *
from persons
where (xxxxx) and (xxx) 

如果有 or,也是这样

select *
from persons
where (aaa or bbb)  and (ccc)

所以,你会发现

Person.where("persons.name = ? or persons.age = ?", 'Pearl', 24).where("ccc")

Person.where(name: 'Pearl').or(Person.where(age: 24)).where("ccc")

要清晰得多,再说了,你的 or 后面再加个 where 你怎么搞?你的 or 条件究竟是在哪个子句里面?

拼 sql 包到 scope 无伤大雅。

#2 楼 @khiav223577 “考虑的有点简单”可不是好事

关于直接写 SQL 是否比较好看,每个人观感都不一
我的确"考虑的有点简单",or 这方法也是 Rails 5 才新加的功能
只希望这个小工具能给还身在 Rails 3, Rails 4 的人多几项选择啰!

要写

Person.where(name: 'Pearl').or(Person.where(age: 24))

还是

Person.where(name: 'Pearl').or(age: 24)

或是

Person.where('name = ? OR age = ?', 'Pearl', 24)

就看个人抉择呗,各語法都支援的

@ericguo 也写过一个or gem, 就是 rails 5 的 or backport 到 rails 4

#9 楼 @nowherekai 不是我写的,我只是把bf4 的封装了一下。。

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