2013-11-25 3 views
4

Я попыталсяRails .где (.... и ....) Поиск для двух значений одного и того же атрибута

@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.

ответ

5

В общем случае запросы «ИЛИ» могут быть записаны как:

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]) 
+0

Вы должны использовать более явные' 'users.name =? OR users.name =?" ', Чтобы объединения не прерывались, если в таблице соединения также есть имя '. Или используйте '.where', как рекомендует @ diego.greyrobot. –

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

следующий запрос: 'SELECT * FROM пользователей, где имя IN (значение1, значение2, Value3);' является тем же самым как этот: 'SELECT * FROM users WHERE name = value1 ИЛИ name = value2 OR name = value3;', поэтому это не отвечает на вопрос. @sabrams нуждается в SQL-предложении 'AND' – prcaen

1

ответ Диего должен решить вопрос Sabrams' без всех в рельсах 4.x (запрос для пользователя с именем x или y)

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

Для тех, кто находит это сообщение, как будто я действительно искал рельсы, вы можете цеплять где угодно. Например, чтобы получить только пользователей, обладающих обоими навыками через таблицу соединений. (Это будет возвращает пользователей с обеих х и у навыка, не возвращает пользователю только х)

@users = User.joins(:skillable_joins).where(skillable_joins: { skill_id: 1 }).where(skillable_joins: { skill_id: 2 }) 
Смежные вопросы