MySQL в PostreSQL и именованный объем - PullRequest
0 голосов
/ 15 июня 2010

У меня есть именованная область для одной из моих моделей, которая работает нормально.Код:

named_scope :inbox_threads, lambda { |user|
{
  :include => [:deletion_flags, :recipiences],
  :conditions => ["recipiences.user_id = ? AND deletion_flags.user_id IS NULL", user.id],
  :group => "msg_threads.id"
}}

Это прекрасно работает на моей локальной копии приложения с базой данных MySQL, но когда я отправляю свое приложение в Heroku (который использует только PostgreSQL), я получаю следующую ошибку:

ActiveRecord::StatementInvalid (PGError: ERROR: column "msg_threads.subject" must appear in the GROUP BY clause or be used in an aggregate function:

SELECT "msg_threads"."id" AS t0_r0, "msg_threads"."subject" AS t0_r1, "msg_threads"."originator_id" AS t0_r2, "msg_thr eads"."created_at" AS t0_r3, "msg_threads"."updated_at" AS t0_r4, "msg_threads"."url_key" AS t0_r5, "deletion_flags"."id" AS t1_r0, "deletion_flags"."user_id" AS t1_r1, "deletion_flags"."msg_thread_id" AS t1_r2, "deletion_flags"."confirmed" AS t1_r3, "deletion_flags"."created_at" AS t1_r4, "deletion_flags"."updated_at" AS t1_r5, "recipiences"."id" AS t2_r0, "recipiences"."user_id" AS t2_r1, "recipiences"."msg_thread_id" AS t2_r2, "recipiences"."created_at" AS t2_r3, "recipien ces"."updated_at" AS t2_r4 FROM "msg_threads" LEFT OUTER JOIN "deletion_flags" ON deletion_flags.msg_thread_id = msg_threads.id LEFT OUTER JOIN "recipiences" ON recipiences.msg_thread_id = msg_threads.id WHERE (recipiences.user_id = 1 AND deletion_flags.user_id IS NULL) GROUP BY msg_threads.id)

Я не так хорошо знаком с работой Postgres, так что мне нужно добавить сюда, чтобы это работало?Спасибо!

1 Ответ

1 голос
/ 15 июня 2010

... must appear in the GROUP BY clause ...

MySQL грубо нарушает стандарт в пользу простоты и позволяет вам не указывать каждый отдельный столбец, который вы ищете в GROUP BY, вместо этого полагаясь на порядокчтобы выбрать «лучшее» доступное значение.

Postgres (и большинство других СУБД), с другой стороны, требует, чтобы вы называли каждый столбец, который вы выбираете в предложении GROUP BY.Если вы собрали этот запрос вручную, вам нужно будет один за другим добавить каждый столбец в GROUP BY.Если ORM сгенерировал этот запрос (как он выглядит на основе всех двойных кавычек), вам нужно проверить их поддержку Postgres и / или сообщить об ошибке с ними.

...