Rails - 链接'where'范围与OR

时间:2016-01-23 01:57:20

标签: ruby-on-rails postgresql activerecord arel

我可以像这样链接范围:

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'

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

但是,由于听起来你需要动态构建查询,我建议你做这样的事情:

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

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

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