2010-06-15 10 views
0

J'ai une portée nommée pour un de mes modèles qui fonctionne bien. Le code est:MySQL vers PostreSQL et Portée Nommée

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" 
}} 

Cela fonctionne très bien sur ma copie locale de l'application avec une base de données MySQL, mais quand je pousse mon application à Heroku (qui utilise uniquement PostgreSQL), je reçois l'erreur suivante:

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)

Je ne suis pas aussi familier avec le travail de Postgres, alors Qu'aurais-je besoin d'ajouter ici pour obtenir ce travail? Merci!

Répondre

1

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

MySQL constitue une violation flagrante de la norme en faveur de la simplicité et vous permet de ne pas spécifier chaque seule colonne que vous cherchez dans GROUP BY, comptant plutôt sur la commande de choisir la « meilleure » valeur disponible. Par contre, Postgres (et la plupart des autres SGBDR) requiert que vous nommiez chaque colonne que vous sélectionnez dans la clause GROUP BY. Si vous avez assemblé manuellement cette requête, vous devrez, un par un, ajouter chaque colonne dans GROUP BY. Si un ORM a généré cette requête (ce à quoi il ressemble sur la base de toutes les guillemets doubles), vous devrez vérifier leur support Postgres et/ou créer un bogue avec eux.