Rails 4是否支持OR查询?

71

所以在Rails 4中,已经加入了使用not查询的长期期望功能。

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

是否已经为or查询添加了类似的支持,或者他们正在计划添加。我通过浏览发布说明找不到任何信息。

显然我已经尝试过了。

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

但那并不起作用。


1
如果你喜欢这样的语法 Article.where(title: 'Rails 3').or(title: 'Rails 4'),你可以使用rails_or - khiav reoy
6个回答

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'")

1
在这种情况下是True。但对于更复杂的条件,这种方法不适用。 - Arjan
1
这正是我担心的。我知道你可以使用任意的 SQL 来完成它。但这恰恰是我想要避免的。我希望,既然他们已经添加了“not”查询,他们也会支持“or”查询。 - Arjan
显然我无法预测 Rails 核心团队的未来计划!你可以尝试在 Github 存储库上开一个 issue。 - gregates
1
你真的应该使用 Article.where( "articles.title = ? OR articles.title = ?", "Rails 3", "Rails 4" ) 来避免 SQL 注入。 - Joshua Pinter
2
如果您的查询不包含用户输入,则不会受到SQL注入攻击的威胁。Article.where("articles.title = '#{some_var}'") 可能会受到SQL注入攻击的威胁,但是 Article.where("articles.title = 'Rails 3' OR articles.title = 'Rails 4'") 则不会。 - gregates
显示剩余4条评论

39

4
即使在Rails 5中有了这个变化,我仍然会坚持使用@gregates的答案,并使用这种语法Article.where(title: ['Rails 3', 'Rails 4'])。它更加简洁,并且与常见的Article.where(id: [1, 2, 3, 4])用法相匹配。 - BigRon
9
这个解决方案的优点在于你可以在两个查询中使用不同的列。 - Eric Duminil
另一个优点是它可以很好地与返回查询的重载方法一起使用 super.or(Article.where(title: 'Rails 4')) - Subtletree

10

5
我知道这是一个旧的帖子,但是任何其他寻找解决此问题的人可能会发现这段代码很有帮助:
Article.where(title: ["Rails 3", "Rails 4"])

也许这可以帮助你引导他们朝着正确的方向前进,而不必冒着SQL注入的风险。

这个回答相对于(更早的)已接受的答案有什么新的补充? - Brad Werth
2
与被接受的答案相比,我认为这个更加简洁易读。 - hellion
当然,这仅适用于相同的列。如果不同的列,则需要使用Rails 4.2或更低版本的原始SQL,以及Rails 5+的新.or方法。 - Joshua Pinter

4

是的,DHH说我们会在Rails 5中拥有它:https://github.com/rails/rails/pull/16052#issuecomment-72718557 - amoebe

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接