2011-02-06 2 views
2

나는 MySQL에서보다 철저하고 Rails에 덜 우호적 인 PostgreSQL으로 전환하려고 시도하고 있습니다.주문하려고 할 때 ActiveRecord/Arel 쿼리가 이상한 것으로 해결됨

나는이 재미있는 수수께끼 실행 해요 :

irb(main):015:0> puts w.to_sql 
SELECT DISTINCT ON (vendors.id) vendors.* 
FROM "vendors" 
INNER JOIN "locations" ON "locations"."locatable_id" = "vendors"."id" 
    AND "locations"."locatable_type" = 'Vendor' 
WHERE (locations.latitude IS NOT NULL AND locations.longitude IS NOT NULL) 

하지만를 ...

irb(main):017:0> puts w.order('vendors.id').to_sql 
SELECT * FROM (
    SELECT DISTINCT ON (vendors.id) vendors.* 
    FROM "vendors" 
    INNER JOIN "locations" ON "locations"."locatable_id" = "vendors"."id" 
    AND "locations"."locatable_type" = 'Vendor' 
    WHERE (locations.latitude IS NOT NULL AND locations.longitude IS NOT NULL) 
) AS id_list ORDER BY id_list.alias_0 

이 단지 유효한 PostgreSQL의 쿼리와 잘 ORDER BY vendors.id 작품을 추가하는 사실에도 불구하고. 그냥 추가하는 대신, 뭔가 재미있는 일을하고 하루의 끝에서 잘못된 쿼리를 생성합니다.

ActiveRecord::StatementInvalid: PGError: ERROR: column id_list.alias_0 does not exist 
LINE 1: ...tions.longitude IS NOT NULL)) AS id_list ORDER BY id_list.al... 

어떤 단서를 봐야합니까?

답변

2

동일한 문제가 발생했습니다. Arel의 버그 인 것 같아서 PostgreSQL을 사용할 때 DISTINCT ON을 ORDER와 함께 사용하면 좋지 않습니다.

레일즈가 등대에서 github 문제로 옮겨 졌으므로 원래의 버그는 더 이상 볼 수 없지만 Google cache을 살펴볼 수 있습니다. recent pull request에 대한 댓글이 있습니다.이 설명은 Rails 3.0.7이 출시 된 후 문제가 해결되었음을 나타냅니다. 3.1과 같아 보이지만 사용하고있는 보석 중 일부는 아직 호환되지 않으므로 확인할 수 없습니다.

현재 해결 방법은 find_by_sql을 사용하는 것입니다.