112

你如何在Rails 5 ActiveRecord中进行or查询?另外,是否可以在 ActiveRecord 查询中链接?orwhere

4

5 回答 5

237

Rails 5将提供在查询中链接or子句和where子句的能力。请参阅相关讨论和拉取请求ActiveRecord

因此,您将能够在Rails 5中执行以下操作:

要获得1 或 2post的a:id

Post.where('id = 1').or(Post.where('id = 2'))

其他一些例子:

(A && B) || C:

    Post.where(a).where(b).or(Post.where(c))

(A || B) && C:

    Post.where(a).or(Post.where(b)).where(c)
于 2015-09-24T04:07:43.047 回答
14

我们不需要等待 rails 5 使用这个OR查询。我们也可以将它与rails 4.2.3. 这里有一个反向端口。

感谢Eric-Guo的 gem where-or,现在我们可以在使用这个 gem时添加这个OR功能。>= rails 4.2.3

于 2015-09-24T06:11:27.453 回答
6

(只是对 KM Rakibul Islam 答案的补充。)

使用范围,代码可以变得更漂亮(取决于眼睛看):

scope a,      -> { where(a) }
scope b,      -> { where(b) }

scope a_or_b, -> { a.or(b) }
于 2018-06-20T19:51:15.323 回答
5

我需要做一个(A && B) || (C && D) || (E && F)

但是在 Rails5.1.4的当前状态下,这太复杂了,无法使用 Arel 或链来完成。但我仍然想使用 Rails 生成尽可能多的查询。

所以我做了一个小技巧:

在我的模型中,我创建了一个名为的私有方法sql_where

private
  def self.sql_where(*args)
    sql = self.unscoped.where(*args).to_sql
    match = sql.match(/WHERE\s(.*)$/)
    "(#{match[1]})"
  end

接下来在我的范围内,我创建了一个数组来保存 OR

scope :whatever, -> {
  ors = []

  ors << sql_where(A, B)
  ors << sql_where(C, D)
  ors << sql_where(E, F)

  # Now just combine the stumps:
  where(ors.join(' OR '))
}

这将产生预期的查询结果: SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F))

现在我可以轻松地将它与其他范围等结合起来,而不会出现任何错误的 OR。

美妙之处在于我的 sql_where 采用正常的 where 子句参数: sql_where(name: 'John', role: 'admin')将生成(name = 'John' AND role = 'admin').

于 2017-10-05T13:21:27.853 回答
1

Rails 5 具有 foror子句的能力where。例如。

User.where(name: "abc").or(User.where(name: "abcd"))
于 2018-12-20T11:16:29.753 回答