如何在ActiveRecord查询中使用OR条件

时间:2012-06-03 14:27:38

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

我想抓住所有提供电子邮件的用户或姓名的用户。例如:

users = User.where(:first_name => "James", :last_name => "Scott")

将返回所有姓名为“James”&的用户。 “斯科特”。

users = User.where(:email => "james@gmail.com")

将用电子邮件返回给用户“james@gmail.com”。

有没有办法让where子句返回具有相同名字和姓氏的用户以及用户在一个where查询中匹配的电子邮件,或者我需要做什么合并了两个单独的where条款。

5 个答案:

答案 0 :(得分:39)

Rails 5带有or method

此方法接受var frame = require('ui/frame'); var drawer = frame.topmost().getViewById("sideDrawer"); function showSideDrawer(){ drawer.showDrawer(); // i prefer using .toggleDrawerState(); }; 个对象。例如:

ActiveRecord::Relation

答案 1 :(得分:12)

试试这个:

users = User.where("(first_name = 'James' and last_name = 'Scott') or email = 'james@gmail.com'")

插入变量:

users = User.where("(first_name = ? and last_name = ?) or email = ?", first_name, last_name, email)

答案 2 :(得分:8)

如果您更喜欢DSL方法(没有SQL),可以使用底层的Arel层:

t = User.arel_table
users = User.where(
  (t[:first_name].eq('Ernie').and(t[:last_name].eq('Scott')).
    or(t[:email].eq('james#gmail.com'))
)

这有点难看,但是如果你在Arel上使用一些包装器(例如,this one),代码会更好:

users = User.where(
  ((User[:first_name] == 'Ernie') & (User[:last_name] == 'Scott')) |
   (User[:email] == 'james#gmail.com')
)

答案 3 :(得分:5)

如果您不想像其他人提到的那样编写SQL,您可以直接访问arel结构(看起来就像另一个答案那样)或者使用squeel gem来更优雅地执行它:< / p>

User.where{(first_name == 'Ernie') & (last_name == 'Scott') | (email == 'james#gmail.com')}

答案 4 :(得分:0)

您可以像Client.where("orders_count = ? AND locked = ?", params[:orders], false)一样使用字符串条件,并将ORAND结合使用。但要注意这些运营商的优先级。

Cf Active Record Query Interface guide