К сожалению, Active Record недостаточно умен (и, если честно, достаточно доверчив), чтобы понять, что ему нужно присоединиться к первой таблице, чтобы применить ваше условие, но не ко второй.
Вы должны быть в состоянии выручить это, будучи немного более явным:
Team.
includes(:team_permissions). # or eager_load(:team_permissions).
preload(team_permissions: :permissible).
where.not(team_permissions: { id: team_permission_ids }
Когда нет условий, ссылающихся на таблицы includes
, по умолчанию используется preload
, который обрабатывает N + 1, выполняя один дополнительный запрос, и совместим с полиморфными ассоциациями. Однако, когда такое условие найдено, все includes
преобразуются в eager_load
, что делает ЛЕВОЕ СОЕДИНЕНИЕ в основном запросе (и, следовательно, несовместимо: не может написать запрос, который объединяет к столам, о которых мы даже не знаем).
Выше я выделил часть, которую мы определенно хотим загрузить через preload
, поэтому она должна работать правильно.