2010-06-15 4 views
0

잘 작동하는 모델 중 하나에 명명 된 범위가 있습니다. 코드는 다음과 같습니다PostreSQL과 명명 된 범위의 MySQL

named_scope :inbox_threads, lambda { |user| 
{ 
    :include => [:deletion_flags, :recipiences], 
    :conditions => ["recipiences.user_id = ? AND deletion_flags.user_id IS NULL", user.id], 
    :group => "msg_threads.id" 
}} 

이 MySQL 데이터베이스와 응용 프로그램 내 로컬 복사본에 잘 작동하지만 나는 (단지 PostgreSQL을 사용) Heroku가 내 응용 프로그램을 누를 때, 나는 다음과 같은 오류 얻을 :

을 내가 포스트 그레스의 작업과 마찬가지로 익숙하지 않다

ActiveRecord::StatementInvalid (PGError: ERROR: column "msg_threads.subject" must appear in the GROUP BY clause or be used in an aggregate function:

SELECT "msg_threads"."id" AS t0_r0, "msg_threads"."subject" AS t0_r1, "msg_threads"."originator_id" AS t0_r2, "msg_thr eads"."created_at" AS t0_r3, "msg_threads"."updated_at" AS t0_r4, "msg_threads"."url_key" AS t0_r5, "deletion_flags"."id" AS t1_r0, "deletion_flags"."user_id" AS t1_r1, "deletion_flags"."msg_thread_id" AS t1_r2, "deletion_flags"."confirmed" AS t1_r3, "deletion_flags"."created_at" AS t1_r4, "deletion_flags"."updated_at" AS t1_r5, "recipiences"."id" AS t2_r0, "recipiences"."user_id" AS t2_r1, "recipiences"."msg_thread_id" AS t2_r2, "recipiences"."created_at" AS t2_r3, "recipien ces"."updated_at" AS t2_r4 FROM "msg_threads" LEFT OUTER JOIN "deletion_flags" ON deletion_flags.msg_thread_id = msg_threads.id LEFT OUTER JOIN "recipiences" ON recipiences.msg_thread_id = msg_threads.id WHERE (recipiences.user_id = 1 AND deletion_flags.user_id IS NULL) GROUP BY msg_threads.id)

, 그래서 내가이 작업을 얻기 위해 여기에 추가해야? 감사!

답변

1

... must appear in the GROUP BY clause ...

는 MySQL은 극악 무도 대신에 "최고"가능한 값을 선택하는 주문에 의존, 단순에 찬성 표준을 위반하고 당신이 GROUP BY 찾고있는 모든 단일 열을 지정하지 않을 수 있습니다.

한편, Postgres (및 대부분의 다른 RDBMS)에서는 GROUP BY 절에서 선택하는 모든 단일 열의 이름을 지정해야합니다. 해당 쿼리를 수동으로 어셈블 한 경우 하나씩 차례대로 각 열을 GROUP BY에 추가해야합니다. ORM이 (모든 큰 따옴표를 기반으로하는 것처럼 보이는) 해당 쿼리를 생성 한 경우 Postgres 지원을 확인하거나 버그를 신고해야합니다.

관련 문제