【问题标题】:Rails - chain 'where' scopes with ORRails - 使用 OR 链接“where”范围
【发布时间】:2016-04-29 18:20:18
【问题描述】:

我可以像这样链接作用域:

scoped = User.where(sex: 'F')
scoped = scoped.where(color: 'blue')

ActiveRecord 为第一行生成此 SQL:

SELECT COUNT(*) FROM "users"  WHERE "users"."sex" = 'F'

第二行的这条 SQL:

SELECT COUNT(*) FROM "users"  WHERE "users"."sex" = 'F' AND "users"."color" = 'blue'

在保留初始查询的同时,它构建在 2 行之上,我如何将其从 AND 更改为 OR 以使最终结果如下所示:

SELECT COUNT(*) FROM "users"  WHERE "users"."sex" = 'F' OR "users"."color" = 'blue'

【问题讨论】:

  • 同意洛根的回答。尝试 squeel 或 arel 以获得更丰富的语法。我们使用 squeel,到目前为止一切顺利。
  • 你能详细说明你需要在多行上构建它的原因吗?
  • 我需要在多行上构建它,因为我正在迭代 hstore 属性中的键数组,并且对于每个键,我想找到所有完全丢失键的记录,或者,如果他们的密钥不是nil""。这是一个循环。然后我想用OR 子句对其进行扩展,以选择所有hstore 属性本身为nil 的记录。

标签: ruby-on-rails postgresql activerecord arel


【解决方案1】:

如果没有扩展,目前在 Rails 中这是不可能的,除非你使用原始 SQL:

User.where('sex = ? OR color = ?', 'F', 'blue')

In Rails 5, these types of ORs will be supported out of the box.

【讨论】:

  • 我需要在多行上构建它。如何使用原始 SQL 在多行上构建它?基本上通过OR 将两个查询加在一起。
【解决方案2】:

如果你使用squeel gem,你可以这样实现:

User.where(
  { sex: 'F' } |
  { color: 'blue' }
)

但是,由于听起来您需要动态构建查询,因此我建议您执行以下操作:

queries = [
  "sex = 'F'",
  "color = 'blue'"
]

User.where(queries.join(" OR "))

使用此方法,您可以根据需要向queries 数组动态添加任意数量的查询。显然,您必须使用原始 SQL 编写查询,但这是我所知道的使用 ActiveRecord 完成此任务的唯一选择。

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 2016-04-14
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2012-09-23
    • 2014-05-30
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多