如何在Rails 3 ActiveRecord中进行OR查询。我找到的所有示例都只有AND查询。

Edit: OR方法从Rails 5开始可用。看到ActiveRecord:: QueryMethods


当前回答

Rails 5附带了一个or方法。(链接到文档)

该方法接受ActiveRecord::Relation对象。例如:

User.where(first_name: 'James').or(User.where(last_name: 'Scott'))

其他回答

用服装

t = Post.arel_table

results = Post.where(
  t[:author].eq("Someone").
  or(t[:title].matches("%something%"))
)

结果SQL:

ree-1.8.7-2010.02 > puts Post.where(t[:author].eq("Someone").or(t[:title].matches("%something%"))).to_sql
SELECT     "posts".* FROM       "posts"  WHERE     (("posts"."author" = 'Someone' OR "posts"."title" LIKE '%something%'))

如果你想使用数组作为参数,下面的代码在Rails 4中工作:

query = Order.where(uuid: uuids, id: ids)
Order.where(query.where_values.map(&:to_sql).join(" OR "))
#=> Order Load (0.7ms)  SELECT "orders".* FROM "orders" WHERE ("orders"."uuid" IN ('5459eed8350e1b472bfee48375034103', '21313213jkads', '43ujrefdk2384us') OR "orders"."id" IN (2, 3, 4))

更多信息:在Rails 4中使用数组作为参数的OR查询。

在Rails 3中,应该是这样

Model.where("column = ? or other_column = ?", value, other_value)

这也包括原始sql,但我不认为有一种方式在ActiveRecord做或操作。你的问题不是新手的问题。

Rails 5添加了或,所以现在在Rails版本大于5的应用程序中更容易做到这一点:

Model.where(column: value).or(Model.where(other_column: other_value)

这也可以处理nil值

如果你想在一个列的值上使用OR操作符,你可以传递一个数组到.where, ActiveRecord将使用IN(value,other_value):

Model.where(:column => ["value", "other_value"]

输出:

SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column` IN ('value', 'other_value')

这应该在单个列上实现与OR相同的效果

我刚刚从客户端工作中提取了这个插件,它可以让你将作用域与。or结合起来。例如post .published.or. authorred_by (current_user)。Squeel (MetaSearch的更新实现)也很棒,但不支持OR作用域,因此查询逻辑可能有点多余。