A mensagem de erro informa:
agregados não permitidos na cláusula WHERE
count() é uma função agregada. Use a cláusula HAVING para isso.A consulta pode ficar assim:
SELECT r.*
FROM recommendations r
JOIN approvals a ON a.recommendation_id = r.id
WHERE r.user_id = $current_user_id
GROUP BY r.id
HAVING count(a.recommendation_id) = 1
Com o PostgreSQL 9.1 ou posterior é suficiente
GROUP BY a chave primária de uma tabela (presumindo recommendations.id é o PK). Nas versões do Postgres anteriores a 9.1 você tinha que incluir todos colunas do SELECT lista que não está agregada no GROUP BY Lista. Com recommendations.* no SELECT list, que seria cada coluna da tabela. Cito as notas de lançamento do PostgreSQL 9.1:
Permitir nãoGROUP BYcolunas na lista de destino da consulta quando a chave primária é especificada noGROUP BYcláusula (Peter Eisentraut)
Mais simples com uma sub-seleção
De qualquer forma, isso é mais simples e rápido, fazendo o mesmo:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Evite multiplicar linhas com um
JOIN a priori, então você não precisa agregá-los de volta.