Rails 5:ActiveRecord OR查询

时间:2015-09-24 04:06:50

标签: ruby-on-rails ruby activerecord ruby-on-rails-5 rails-activerecord

如何在 Rails 5 ActiveRecord中进行or查询?此外,是否可以在ActiveRecord查询中将orwhere链接起来?

5 个答案:

答案 0 :(得分:204)

Rails 5 中可以找到or子句与where查询中的ActiveRecord子句链接的功能。请参阅related discussion and the pull request

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

要获得post id 1或2:

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)

答案 1 :(得分:12)

我们不需要等待rails 5使用此OR查询。我们也可以将其与rails 4.2.3一起使用。有一个backport here

感谢Eric-Guo获取gem where-or,现在我们可以使用此gem在OR中添加此>= rails 4.2.3功能。

答案 2 :(得分:4)

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

但是在Rails 5.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')

答案 3 :(得分:3)

(这只是K M Rakibul Islam答案的补充。)

使用范围,代码可以变得更漂亮(取决于外观)

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

scope a_or_b, -> { a.or(b) }

答案 4 :(得分:0)

第5轨具有使用or的{​​{1}}子句的能力。 例如。

where