2011-08-04 34 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

確實沒有猴子補丁或插件。我使用的唯一一個與此查詢相關的gem是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解決了這個問題,並解決了這個問題。

我覺得這個錯誤非常愚蠢,但希望這可以幫助遇到同樣問題的其他人。

相關問題