ruby-on-rails - 为什么此 ActiveRecord 语句在服务器中失败但在控制台中失败

标签 ruby-on-rails postgresql activerecord

我有以下查询在特定 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/

相关文章:

sql - Postgresql - 如何仅在满足特定条件时插入

ruby-on-rails - has_many :through a has_and_belongs_to_many association

php - 未捕获的 ActiveRecord\UndefinedPropertyException codeigniter

ruby-on-rails - 部署时的 bundle 程序错误

mysql - 使用共享和专用托管服务器时的数据库查询性能

ruby-on-rails - 设置 Vagrant 来镜像一个 heroku 实例

ruby-on-rails - Rails EXCEPT 查询(过滤出联合表中存在的记录)

javascript - Rails + Ember + Ember 数据空 JSON 响应

恢复后Postgresql自动递增ID?

ruby-on-rails - 如何调用 ActiveRecord::Base 的加载方法?