Rails .where(....和....)搜索相同属性的两个值

时间:2013-11-25 16:40:36

标签: sql ruby-on-rails activerecord

我试过

@users = User.where(name: @request.requester or @request.regional_sales_mgr)

@users = User.where(name: @request.requester).where(name: @request.regional_sales_mgr).all

这似乎不起作用。我想要的是找到名称与@ request.requester匹配的用户,以及名称与@ request.regional_sales_mgr匹配的用户,并将它们保存到变量@users中。

3 个答案:

答案 0 :(得分:6)

您想要使用SQL IN子句。 Activerecord提供了一个快捷方式:

@users = User.where(name: [@request.requester, @request.regional_sales_mgr]).all

将值数组赋给name:将生成以下SQL语句:

SELECT * FROM users WHERE name IN (value1, value2, and so on...);

这应该找到名称为@request.requester@request.regional_sales_mgr

的所有用户

答案 1 :(得分:5)

在一般情况下,“OR”查询可以写成:

User.where("users.name = ? OR users.name = ?", request.requester, request.regional_sales_mgr)

注意: Rails 5 将支持OR使用:

User.where(name: request.requester).or(User.where(name: request.regional_sales_mgr))

对于这种特定情况,作为其他答案中的状态,IN查询更简单:

User.where(name: [request.requester, request.regional_sales_mgr])

答案 2 :(得分:1)

迭戈的答案应该解决Sabrams'没有全部在rails 4.x中的问题(查询名称为x或y的用户)

@users = User.where(name: [@request.requester, @request.regional_sales_mgr])

对于那些发现这篇文章的人,就像我实际上一直在寻找一个轨道,你可以链接到哪里。例如,仅通过连接表获得具有两种技能的用户。 (这将返回具有x和y技能的用户,不会返回仅具有x的用户)

@users = User.joins(:skillable_joins).where(skillable_joins: { skill_id: 1 }).where(skillable_joins: { skill_id: 2 })