Rails/AR Найдите, где HABTM не включает
-
16-09-2019 - |
Вопрос
У меня есть приложение Rails с пользователями и каждая пользовательская роль HABTM.
Я хочу выбрать пользователей без определенной роли. У меня в SearchLogic в моем распоряжении, и я потерян. Я пытался использовать комбинацию условий и соединений и включает, а что нет, но я не могу прибить это. Это работает:
User.find(:all, :conditions => ['role_id != ?', Role[:admin].id], :joins => :roles)
Чтобы найти пользователей, которые не являются администраторами, но не находят пользователей без ролей (которые я также хочу найти).
Что просто мне не хватает в своем усталом состоянии?
Решение
Как насчет этого:
User.find :all, :conditions => [ 'roles.id is ? or roles.id != ?', nil, Role[:admin].id ], :include => :roles
Это работает для has_many :through
, похоже, это должно быть то же самое для Habtm.
Другие советы
Используйте подрезы и не в операторе
User.find(:all,:conditions => ["id NOT IN (select user_id from roles_users where role_id = ?)", Role[:admin].id)
я могу сделать
User.all - User.find(:all, :conditions => ['role_id = ?', Role[:admin].id], :joins => :roles)
Который выполняет то, что я хочу в двух запросах, что, вероятно, в порядке для этого проекта, но если я смогу получить его на один запрос, это было бы неплохо.