복붙노트

[RUBY-ON-RAILS] PGError는 오류 : 골재는 객체의 AR 쿼리와 has_many 개체에 WHERE 절에 사용할 수 없습니다

RUBY-ON-RAILS

PGError는 오류 : 골재는 객체의 AR 쿼리와 has_many 개체에 WHERE 절에 사용할 수 없습니다

has_many 협회에서 다음 쿼리를 실행합니다. 권장 승인을 has_many.

나는 3과 PostgreSQL 레일, 실행하고 있습니다 :

Recommendation.joins(:approvals).where('approvals.count = ?
                      AND recommendations.user_id = ?', 1, current_user.id)

이것은 다음과 같은 오류를 반환 : https://gist.github.com/1541569

해결법

  1. ==============================

    1.오류 메시지를 알려줍니다 :

    오류 메시지를 알려줍니다 :

    () 계산은 총 함수이다. 그에 대한 HAVING 절을 사용합니다. 쿼리는 다음과 같이 수 :

    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
    

    이 테이블의 기본 키에 의해 GROUP에 충분하다 PostgreSQL을 9.1 이상 (recommendations.id를 추정하는 것은 PK)입니다. 포스트 그레스 버전 9.1 전에 GROUP BY 목록에 집계되지 않은 SELECT 목록의 모든 열을 포함했다. 권장. * SELECT 목록에서, 그 테이블의 모든 단일 열 것입니다.

    나는 PostgreSQL을 9.1의 릴리스 노트를 인용 :

    어느 쪽이든,이 같은 일을, 간단하고 빠른 :

    SELECT *
    FROM   recommendations r
    WHERE  user_id = $current_user_id
    AND   (SELECT count(*)
           FROM   approvals
           WHERE  recommendation_id = r.id) = 1;
    

    A를 피 곱 행이 사전 가입, 당신은 그들을 다시 집계 할 필요가 없습니다.

  2. ==============================

    2.당신 같은 외모는 열라는 이름의 수를 가지고 PostgreSQL는 계수 집계 함수로 해당 열 이름을 해석한다. 귀하의 SQL은 다음과 같이 끝 :

    당신 같은 외모는 열라는 이름의 수를 가지고 PostgreSQL는 계수 집계 함수로 해당 열 이름을 해석한다. 귀하의 SQL은 다음과 같이 끝 :

    SELECT "recommendations".*
    FROM "recommendations"
    INNER JOIN "approvals" ON "approvals"."recommendation_id" = "recommendations"."id"
    WHERE (approvals.count = 1 AND recommendations.user_id = 1)
    

    오류 메시지는 특히 approvals.count를 가리키는 :

    LINE 1: ...ecommendation_id" = "recommendations"."id" WHERE (approvals....
                                                                 ^
    

    내 PostgreSQL의 (9.0)에서 그 오류를 재현 할 수는 없지만 어쩌면 당신은 다른 버전을 사용하고 있습니다. 귀하의 경우에 해당 열 이름을 인용 더블보십시오 :

    Recommendation.joins(:approvals).where('approvals."count" = ? AND recommendations.user_id = ?', 1, current_user.id)
    

    그 종류의 물건을 밖으로 그때 뭔가 다른에 approvals.count 열 이름을 변경하는 것이 좋습니다 싶다면 그래서 당신은 더 이상 그것에 대해 걱정할 필요가 없습니다.

  3. from https://stackoverflow.com/questions/8684486/pgerror-error-aggregates-not-allowed-in-where-clause-on-a-ar-query-of-an-objec by cc-by-sa and MIT license