Rails与使用AND而不是OR的地方连接

时间:2016-04-08 01:22:22

标签: ruby-on-rails postgresql activerecord

我有一个范围(其中title是一个数组)

scope :with_label, ->(title) { joins(:labels).where(labels: { title: title }) }

默认情况下,这会执行AND查询。如何才能进行OR查询?我似乎无法找到任何这方面的例子。

我相信这是生成的SQL:

Label Load (0.1ms)  SELECT  "labels".* FROM "labels" WHERE "labels"."project_id" = $1 AND "labels"."title" = $2  ORDER BY "labels"."title" ASC LIMIT 1  [["project_id", 8], ["title", "label1,label2,label3"]]

1 个答案:

答案 0 :(得分:2)

Rails / ActiveRecord仅支持OR次查询in Rails 5。在早期版本中,您需要使用SQL字符串来实现OR查询:

Widget.where("name = ? OR name = ?", "foo", "bar") # postgres

当有很多可能性时,使用IN查询可以更有效地完成同样的事情,该查询是通过将具有多个元素的数组传递给#where方法在ActiveRecord中生成的:< / p>

arr = ["foo", "bar", "baz"]
Widget.where(name: arr)

至于您发布的SQL输出:

Label Load (0.1ms)  SELECT  "labels".* FROM "labels" WHERE "labels"."project_id" = $1 AND "labels"."title" = $2  ORDER BY "labels"."title" ASC LIMIT 1  [["project_id", 8], ["title", "label1,label2,label3"]]

这里的AND来自于对product_id以及title进行查询的事实,而不是因为与title有任何关系。