71

not所以在 Rails 4 中添加了使用查询的长期需要的特性。

Article.where.not(title: 'Rails 3')

是否为or查询添加了类似的支持,或者他们是否计划这样做。通过浏览发行说明,我找不到任何东西。

显然我试过了

Article.where(title: 'Rails 3').or(title: 'Rails 4')

但这不起作用。

4

7 回答 7

99
Article.where(title: ['Rails 3', 'Rails 4'])

是你在 Active Record 中的做法。

无法使用“Rails-y”语法复制任何任意 SQL 查询。但是你总是可以只传入文字 sql。

所以你也可以这样做:

Article.where("articles.title = 'Rails 3' OR articles.title = 'Rails 4'")
于 2013-06-19T13:42:39.050 回答
40

这现在适用于 Rails 5:

Article.where(title: 'Rails 3').or(Article.where(title: 'Rails 4'))

Rails 源代码中的代码示例

于 2016-03-05T13:11:03.607 回答
11

最常见的替代方案已经由@gregates 回答

最近在rails源中有拉取请求

向 active_record添加#any_of查询方法向 activerecord 添加或功能

贡献者已经创建了一个 gem,以防它不被接受

它的 rails 3.2 和 4 兼容

https://github.com/oelmekki/activerecord_any_of

我还没有尝试过,但很快希望使用它对我来说看起来不错。

于 2013-06-19T13:56:24.537 回答
5

我知道这是一个旧线程,但其他任何寻找此问题解决方案的人可能会发现此代码很有帮助:

Article.where(title: ["Rails 3", "Rails 4"])

也许这将帮助您让某人朝着正确的方向前进,而不必冒 sql 注入的风险。

于 2014-03-13T22:02:09.213 回答
4

rails master 分支现在似乎支持 OR 查询。https://github.com/rails/rails/pull/16052

我认为它将在下一个主要版本的框架中。

于 2015-02-02T22:37:02.007 回答
3

Rails 5 将支持它,但您可以将此 backport 用于 Rails 4.2:https ://github.com/Eric-Guo/where-or

于 2015-10-21T18:20:09.843 回答
2

您可以将Squeel用于更复杂的查询:

Article.where{(title == 'Rails 3') | (title == 'Rails 4')}

这将导致以下 SQL 查询:

SELECT `articles`.* FROM `articles` WHERE ((`articles`.`title` = 'Rails 3' OR `articles`.`title` = 'Rails 4'))
于 2013-06-19T15:08:57.757 回答