首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:列"pitch_count“在别名中存在时不存在

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

Stack Overflow用户
提问于 2019-09-04 22:45:44
回答 2查看 233关注 0票数 2

我在Rails 5中运行以下查询,目的是找到具有最多投球的用户:

代码语言:javascript
复制
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)

但我发现了错误:

代码语言:javascript
复制
Caused by PG::UndefinedColumn: ERROR:  column "pitch_count" does not exist

为什么pitch_count不能对查询进行排序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-07 07:39:43

问题在未限定范围方法中。它移除所有以前定义的作用域,包括select语句。请参见以下示例:

代码语言:javascript
复制
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"

看到区别了吗?在unscoped定义之后调用的select完全删除了select中定义的所有东西。

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

代码语言:javascript
复制
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)

注意:新增的行主要是为了可读性,但在您的ruby文件中应该是这样工作的。如果您想在rails控制台中执行它。你将不得不删除新的行

顺便说一句。仍然可能会出现错误,即列"user.id“必须出现在GROUP子句中,或者在聚合函数中使用。应该修改group语句以使用users.id而不是pitch.user_id来解决这个问题。

代码语言:javascript
复制
  .group("users.id")
票数 5
EN

Stack Overflow用户

发布于 2019-09-04 23:15:02

我建议您使用缓存使其易于维护,并提高性能。通过添加计数器缓存,您可以通过User.reorder(pitches_count: :desc).first获得具有大多数投球的用户记录。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57796426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档