我有以下查询在特定控制器中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
的目的。
答案 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
副本来修复此问题,这解决了问题。
我觉得犯这个错误很傻,但希望这会帮助那些遇到同样问题的其他人。