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

我遇到了同样的问题。看起来这是 Arel 中的一个错误,导致 DISTINCT ON 在使用 PostgreSQL 时无法与 ORDER 配合使用。

由于 Rails 已从 Lighthouse 转移到 github 问题,因此原始错误不再可见,但您可以查看Google 缓存。有一条关于最近的拉取请求的评论表明该问题在 Rails 3.0.7 发布后得到修复。看起来它将在 3.1 中,但我无法验证,因为我正在使用的某些 gem 尚不兼容。

当前的解决方法是使用 find_by_sql。

于 2011-05-24T20:41:50.190 回答