2011-02-06 6 views
2

私は、MySQLから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

同じ問題が発生しました。 PostgreSQLを使用しているときに、Arelのバグのように見えて、DISTINCT ONをORDERとうまく行かないようにしました。

RailsがLighthouseからgithubに移行したため、元のバグは表示されなくなりましたが、Google cacheをご覧ください。 recent pull requestの詳細は、Rails 3.0.7がリリースされた後に問題が修正されたことを示すコメントがあります。 3.1と同じように見えますが、使用している宝石の中には互換性がないものがあるため、確認できませんでした。

現在の回避策は、find_by_sqlを使用することです。

関連する問題