【问题标题】:How to use OR condition in ActiveRecord query如何在 ActiveRecord 查询中使用 OR 条件
【发布时间】:2012-06-03 14:27:37
【问题描述】:

我想获取所有具有电子邮件作为提供的电子邮件或名字和姓氏的用户。比如:

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

这将返回名字和姓氏为“James”和“Scott”的所有用户。

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

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

有没有办法执行where 子句来返回具有相同名字和姓氏的用户以及具有在一个where 查询中匹配的电子邮件的用户,或者我是否需要在2 个单独的 where 子句。

【问题讨论】:

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


【解决方案1】:

Rails 5 带有or method

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

User.where(first_name: 'James', last_name: 'Scott')
    .or(User.where(email: 'james@gmail.com'))

【讨论】:

  • 对于 Rails 5 应用程序,这应该被认为是最正确的答案。
【解决方案2】:

试试这个:

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)

【讨论】:

    【解决方案3】:

    如果您更喜欢 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')
    )
    

    【讨论】:

    • 有趣的包装器,我一直不喜欢使用 arel,但我可能不太反对它;不错。
    【解决方案4】:

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

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

    【讨论】:

    • 是的,我想这更像是红宝石。无论如何,它也需要调整才能使用变量。
    【解决方案5】:

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

    参见Active Record Query Interface guide

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2017-09-09
      • 2011-12-20
      • 2015-12-21
      • 1970-01-01
      相关资源
      最近更新 更多