Почему запрос с операторами И и ИЛИ дает неожиданные результаты? - PullRequest
2 голосов
/ 22 сентября 2011

У меня есть этот запрос, но он не дает ожидаемых результатов: User.all(:conditions => ["company_id == ? AND role_id == ? OR role_id == ? OR role_id == ?", X, 1,2,3 ])

Это должно означать: Получить всех пользователей с X company_id И их роли могут быть 1 или 2 или 3.

Так что это может быть одна из этих ролей, но ВСЕ эти пользователи должны быть из ЭТОГО company_id.

Ответы [ 4 ]

5 голосов
/ 22 сентября 2011

Это не работает, потому что приоритет неправильный. То есть

company_id = ? AND role_id = ? OR role_id = ? OR role_id = ?

интерпретируется как

((company_id = ? AND role_id = ?) OR role_id = ?) OR role_id = ?

потому что AND имеет более высокий приоритет, чем OR - но более уместно для этого случая - они оба ассоциированы слева.

Простое исправление будет таким:

company_id = ? AND (role_id = ? OR role_id = ? OR role_id = ?)

(Но посмотрите другие ответы для альтернативного синтаксиса и / или подходов. Я также позволил себе исправить оператор равенства)

Удачного кодирования.

3 голосов
/ 22 сентября 2011

Может быть пара вещей.

Первое использование одинарное равняется =, а не двойное равно == в :conditions => "...".

Во-вторых, вы можете использовать "...AND role_id IN (?,?,?)", X, 1, 2, 3]),или вам нужно сгруппировать ваши role_id сравнения с круглыми скобками, чтобы это было condition AND (condition OR condition OR condition).

1 голос
/ 22 сентября 2011

Возможно, вы захотите расследовать https://github.com/binarylogic/searchlogic

Однако в противном случае вы можете сказать

User.all(:conditions => ["company_id = ? AND role_id IN (?,?,?)", X, 1,2,3 ])
0 голосов
/ 23 сентября 2011

Для дальнейшего использования, это помогло мне значительно упростить поиск такого рода, вы можете сделать:

company_id = "X"
role_ids = [1,2,3]
User.find(:all, :conditions => "company_id=#{company_id} AND role_id IN (#{role_ids.join(',')})")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...