错误:别名中存在“ pitch_count”列时不存在

rcd*_*rcd 2 postgresql ruby-on-rails

我在Rails 5中运行以下查询,目的是寻找音高最高的用户:

User
  .select("users.*, COUNT(user_id) as pitch_count")
  .unscoped
  .joins("LEFT JOIN pitches AS pitches ON pitches.user_id = users.id")
  .group("pitch.user_id")
  .order("pitch_count DESC")
  .limit(5)
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误:

Caused by PG::UndefinedColumn: ERROR:  column "pitch_count" does not exist
Run Code Online (Sandbox Code Playgroud)

为什么查询不能按pitch_count排序?

eda*_*edl 5

问题出在无范围的方法中。它删除所有先前定义的范围,包括select语句。请参见以下示例:

User.select(:full_name, :email).unscoped.to_sql
# => SELECT "users".* FROM "users"

User.unscoped.select(:full_name, :email).to_sql
# => SELECT "users"."full_name", "users"."email" FROM "users"
Run Code Online (Sandbox Code Playgroud)

看到不同?定义完全删除定义的所有东西unscoped后调用。selectselect

对您来说,这意味着您应该修改代码以unscoped在模型名称后立即调用:

User
  .unscoped
  .select("users.*, COUNT(user_id) as pitch_count")
  .joins("LEFT JOIN pitches AS pitches ON pitches.user_id = users.id")
  .group("pitch.user_id")
  .order("pitch_count DESC")
  .limit(5)
Run Code Online (Sandbox Code Playgroud)

注意:新添加的行主要是为了提高可读性,但在ruby文件中应像这样工作。如果要在rails控制台中执行它。您将必须删除新行


顺便说一句。您仍然可能会收到错误消息,即“ user.id”列必须出现在GROUP BY子句中或在聚合函数中使用。应该通过修改group语句来users.id代替pitch.user_id

  .group("users.id")
Run Code Online (Sandbox Code Playgroud)