2011-08-04 5 views
1

特定のコントローラーでは、rails sに失敗した次の照会があります。 rails cで失敗していません。このActiveRecordステートメントはサーバーではなくコンソールでは失敗します。

Post.includes(:user).find(:all, :limit => 10, :order => 'users.display_name ASC') 

コンソールでは、正しいデータが返されます。サーバーでは、私はこのエラー

ActiveRecord::StatementInvalid: PGError: ERROR: column posts.users.display_name does not exist 
LINE 1: ...s_count" AS t0_r7, "posts"."popularity" AS t0_r8, "posts"."u... 
                  ^

を取得するクエリが長く、私はコントローラで

: SELECT "posts"."id" AS t0_r0, "posts"."post_content" AS t0_r1, 
...  
"posts"."popularity" AS t0_r8, "posts"."users.display_name" AS t0_r9, 
"posts"."subtopics.name" AS t0_r10, "posts"."categories.category_name" 
AS t0_r11 
... 
FROM "posts" LEFT OUTER JOIN "users" ON "users"."id" = "posts"."user_id" 
ORDER BY users.display_name ASC LIMIT 10 

いくつかの関連するスニペットをちょうど含まれます、クエリは3つの余分な用語を生成します。クエリは、t0_r9、t0_r10、およびt0_r11というラベルを付けます。それは私がそのコントローラアクションの観点からそれらの特定の列を参照しているので、ARがこれを追加しているようです。私はそれがなぜそれをするのかわかりませんが、それはincludesの目的です。

+0

ARやPGの宝石のいずれかでバグを発見した可能性がありますが、私は他の目でこれを確認したいと思います。 –

+0

クエリ生成に影響を与える可能性のある宝石、プラグイン、またはサルのパッチを使用していますか?このような奇妙な問題に遭遇すると、それは通常私の問題です。 –

+0

確かにサルのパッチやプラグインはありません。私がこのクエリに関連して使用していた唯一の宝石はwill_paginateでしたが、私はその投稿を使わずにエラーを再現しました。 PG gemは、PostgreSQL用のActiveRecordアダプタです。これをコンソールから実行すると、宝石やプラグインが表示されずロードされませんか? –

答えて

1

私は投稿したコードにエラーがありませんでした。私は注文する列を決定する助けをしました。

valid_names = Post.column_names 
valid_names = valid_names.concat(["users.display_name", "subtopics.name", 
    "categories.category_name"]) 

valid_names.include?(params[:sort]) ? params[:sort] : "popularity" 

リトル私は、これは実際にPost.column_names上に余分な用語を連結することを知っていた:それはこのような何かを見ました。 Post.column_names.cloneでコピーしてこの問題を修正し、これで問題は解決しました。

私はこの間違いをかなり愚かに感じますが、うまくいけば、これは同じ問題を抱えている他の人に役立つでしょう。

関連する問題