Rails/AR найти, где habtm не включает

У меня есть приложение Rails с пользователями, и каждый пользователь HABTM Роли.

Я хочу выбрать пользователей без определенной роли. В моем распоряжении есть searchlogic, и я заблудился. Я пытался использовать комбинацию условий, объединений и включений, а что нет, но, похоже, я не могу это понять. Это работает:

User.find(:all, :conditions => ['role_id != ?', Role[:admin].id], :joins => :roles)

Чтобы найти пользователей, которые не являются администраторами, но не находят пользователей без ролей (которые я также хочу найти).

Какую простую вещь мне не хватает в моем уставшем состоянии?

3 ответа

Решение

Как насчет этого:

User.find :all, :conditions => [ 'roles.id is ? or roles.id != ?', nil, Role[:admin].id ], :include => :roles

Это работает для has_many :throughПохоже, что это должно быть то же самое для HABTM.

Используйте подзапрос и оператор NOT IN

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)

Который выполняет то, что я хочу в двух запросах, что, вероятно, хорошо для этого проекта, но если бы я мог получить его для одного запроса, было бы неплохо.

Другие вопросы по тегам