我有以下查询在特定 Controller 的 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
在 Controller 中,查询生成 3 个额外的术语。查询将它们标记为 t0_r9、t0_r10 和 t0_r11。似乎 AR 正在添加这个,因为我在该 Controller 操作的 View 中引用了那些特定的列。不过,我不明白为什么要这样做,因为这是使用 includes
的目的。
最佳答案
所以错误不在我发布的代码中。我有一个 helper 来确定按哪一列排序。它看起来像这样:
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
制作副本解决了这个问题,这解决了这个问题。
我觉得犯这个错误很愚蠢,但希望这能帮助遇到同样问题的其他人。
关于ruby-on-rails - 为什么此 ActiveRecord 语句在服务器中失败但在控制台中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6948966/