Вам нужно учесть, что происходит в базе данных, чтобы получить ответ.
Делая users.joins(:occupation)
, вы запрашиваете пользователей, присоединившихся к профессии. Это будет внутреннее объединение , поэтому вы получите результаты только для пользователя, у которого есть профессия. По сути, вы запрашиваете количество всех пользователей, имеющих профессию.
Вы можете сделать users.left_outer_joins(:occupation)
, который выполнит внешнее соединение и вернет всех пользователей (присоединение). их на занятие, если у них есть занятие).
Если вы просто хотите достаточно эффективно загружать пользователей и связанные с ними занятия, вы можете использовать users.includes(:occupation)
, что исключает явное объединение их в один запрос (если вы не ссылаетесь на них). Поля заполнения в запросе, но это совсем другой вопрос, я подозреваю).
Обратите внимание, что вы можете получить похожую проблему подсчета сверх , если присоединитесь к ассоциации, которая имеет много значений. В этом случае вы получите несколько строк в результатах для каждой объединенной записи (например, пользователь с двумя профессиями будет учитываться дважды).