Не уверен, есть ли простой способ сделать это, но это должно работать:
User.joins(:tasks).select("users.*, count(*) as task_count").having("task_count < 5").group(:id)
РЕДАКТИРОВАТЬ : приведенное выше возвращает только экземпляры пользователя, которые имеют по крайней мере одну связанную задачу.
То, что вы хотите:
User.joins("LEFT JOIN tasks ON tasks.user_id = users.id").select("users.*, IFNULL(count(tasks.id), 0) AS task_count").having("task_count < 5").group(:id)
Но лучшим решением, вероятно, является просто добавление counter_cache к вашей модели User.