ActiveRecord / Arel запрос разрешает что-то странное при попытке заказа - PullRequest
2 голосов
/ 06 февраля 2011

Я пытаюсь перейти от 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...

Любая подсказка, на что мне смотреть?

1 Ответ

2 голосов
/ 25 мая 2011

Я столкнулся с той же проблемой.Похоже, что это была ошибка в Arel, из-за которой DISTINCT ON не играл хорошо с ORDER при использовании PostgreSQL.

Первоначальная ошибка больше не видна, поскольку Rails перешел с Lighthouse на проблемы с github, но вы можете взглянуть кеш Google .Есть комментарий к более недавнему запросу на получение , который указывает на то, что проблема была исправлена ​​после выпуска Rails 3.0.7.Похоже, что это будет в 3.1, но я не смог проверить, так как некоторые из используемых мной драгоценных камней еще не совместимы.

В настоящее время обходится использование find_by_sql.

...