2

私は、MySQL から、より厳格で Rails にあまり適していないと思われる PostgreSQL への移行を試みています。

私はこの面白い難問に直面しています:

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 

これは、追加ORDER BY vendors.idするだけで有効な PostgreSQL クエリとして問題なく機能するという事実にもかかわらずです。それを追加するだけでなく、非常に面白いことを行い、一日の終わりに無効なクエリを生成します。

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...

私が見るべき手がかりはありますか?

4

1 に答える 1

2

私は同じ問題に遭遇しました。PostgreSQL を使用しているときに、DISTINCT ON が ORDER で適切に動作しない原因となった Arel のバグだったようです。

Rails が Lighthouse から github の問題に移行したため、元のバグは表示されなくなりましたが、Google のキャッシュを確認できます。Rails 3.0.7 のリリース後に問題が修正されたことを示す最近のプル リクエストに関するコメントがあります。3.1 になるようですが、使用している gem の一部がまだ互換性がないため、確認できませんでした。

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

于 2011-05-24T20:41:50.190 に答える