Выбор запросов, на которые пользователь еще не ответил

Я использую heroku/rails/pgsql 9.1.6 и бьюсь головой о стену о том, что мне кажется, что это должен быть действительно простой запрос.

Я хочу показать недавние «запросы», на которые пользователь еще не ответил

Попытка 1 (работает до того, как я нажму на heroku/pgsql):

Request.includes(:responses).where("(select count(responses.id)=0 WHERE responses.user=?) AND requests.created_at > ?", user_id, days_ago ) 

Как только я нажимаю на героку, этот запрос выдает ошибку:

ActiveRecord::StatementInvalid: PGError: ERROR: агрегаты не разрешены в предложении WHERE

Попытка 2: «Наличие»

Я нашел в StackOverflow ветку, в которой говорилось, что вместо этого я должен попробовать «Иметь», поэтому я перешел к

Request.includes(:responses).having("responses.user_id=? AND count(responses.id)=0", user_id).where("requests.created_at > ?", days_ago )

Это вызвало новую ошибку. ActiveRecord::StatementInvalid: PGError: ОШИБКА:

столбец «requests.id» должен присутствовать в предложении GROUP BY или использоваться в агрегатной функции.

Попытка 3: «Группа»

Затем я пересмотрел этот запрос на

Request.includes(:responses).group("requests.id").group("responses.id").having("responses.user_id=? AND count(responses.id)=0", user_id).where("requests.created_at > ?", days_ago ) 

Это выполняется, но возвращает пустой набор, даже если я знаю, что он должен возвращать значение.

Лучшая догадка:

Я подозреваю, что проблема на данный момент связана с предложением 2-й части, и что в текущем формате он непреднамеренно исключает пользователей, которые не ответили (и, таким образом, всегда будет пустым набором):

e.g. having("responses.user_id=? AND count(responses.id)=0", user_id),

в отличие от оригинального встроенного выбора:

выберите количество (responses.id) = 0, ГДЕ responses.user =?

но я не уверен, какой должна быть правильная форма для предложения «иметь» для поверхностных пользователей, которые не ответили.

Заранее благодарю за любую помощь!


person silvermanip    schedule 11.02.2013    source источник


Ответы (1)


пытаться

Request.where('(SELECT Count(*) FROM responses WHERE responses.request_id = requests.id) > 0')
person jvnill    schedule 11.02.2013