【问题标题】:Does Rails 4 have support for OR queriesRails 4 是否支持 OR 查询
【发布时间】:2013-06-19 13:41:57
【问题描述】:

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

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

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

显然我试过了

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

但这不起作用。

【问题讨论】:

  • 如果你喜欢Article.where(title: 'Rails 3').or(title: 'Rails 4')的语法,你可以使用rails_or

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:
Article.where(title: ['Rails 3', 'Rails 4'])

这就是你在 Active Record 中的做法。

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

所以你也可以这样做:

Article.where("articles.title = 'Rails 3' OR articles.title = 'Rails 4'")

【讨论】:

  • 在这种情况下为真。但这不适用于更复杂的条件。
  • 这就是我害怕的。我知道你可以用任意 sql 来做到这一点。但这正是我试图避免的。我希望,既然他们添加了not 查询,他们也将支持or 查询。
  • 显然我无法谈论 Rails 核心团队的未来计划!您可以尝试在 github repo 上打开一个问题。
  • 真的应该使用Article.where( "articles.title = ? OR articles.title = ?", "Rails 3", "Rails 4" )来避免SQL注入。
  • 如果您的查询不包含用户输入,您就不会受到 SQL 注入的攻击。 Article.where("articles.title = '#{some_var}'")可能容易受到 SQL 注入攻击,但 Article.where("articles.title = 'Rails 3' OR articles.title = 'Rails 4'") 不是。
【解决方案2】:

现在可以在 Rails 5 中使用:

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

Code example in Rails's source.

【讨论】:

  • 即使 Rails 5 发生了这种变化,我还是会坚持使用@gregates 的答案并使用这种语法Article.where(title: ['Rails 3', 'Rails 4'])。它不那么冗长,并且与Article.where(id: [1, 2, 3, 4])的常见用法相匹配
  • 这个方案的好处是可以在两个查询中使用不同的列。
  • 另一个优点是它适用于返回查询super.or(Article.where(title: 'Rails 4'))的覆盖方法
【解决方案3】:

@gregates 已经回答了最常见的选择

最近在rails源中有pull request

Add #any_of query method to active_record 哪个添加或功能到 activerecord

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

它的 rails 3.2 和 4 兼容

https://github.com/oelmekki/activerecord_any_of

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 这对(更老的)接受的答案有什么好处?
    • 与接受的答案相比,我认为这更干净,更容易阅读。
    • 当然,这仅适用于同一列。如果它是不同的列,则需要使用 Rails 4.2 或更低版本的原始 SQL,以及 Rails 5+ 的新 .or 方法。
    【解决方案5】:

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

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

    【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      您可以使用Squeel 进行更复杂的查询:

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

      这会产生以下 SQL 查询:

      SELECT `articles`.* FROM `articles` WHERE ((`articles`.`title` = 'Rails 3' OR `articles`.`title` = 'Rails 4'))
      

      【讨论】:

      • 是的,我也可以使用Arel。但我正在寻找原生解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2014-11-29
      • 1970-01-01
      相关资源
      最近更新 更多