为什么此ActiveRecord语句在Server中失败但在Console中失败

时间:2011-08-04 21:48:24

标签: ruby-on-rails postgresql activerecord

我有以下查询在特定控制器中rails s失败。它在rails c中没有失败。

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的目的。

1 个答案:

答案 0 :(得分: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副本来修复此问题,这解决了问题。

我觉得犯这个错误很傻,但希望这会帮助那些遇到同样问题的其他人。